/*********************************************************************** THIS FILE IS AUTOMATICALLY GENERATED. DO NOT MODIFY DEVELOPER: Zihan Chen(vczh) ***********************************************************************/ #include "VlppWorkflowCompiler.h" /*********************************************************************** .\ANALYZER\CHECKSCOPES_CYCLEDEPENDENCY.CPP ***********************************************************************/ namespace vl { namespace workflow { namespace analyzer { using namespace collections; using namespace reflection; using namespace reflection::description; using namespace typeimpl; /*********************************************************************** CheckBaseClass ***********************************************************************/ class CheckCycleDependencyDeclarationVisitor : public empty_visitor::DeclarationVisitor , public empty_visitor::VirtualCseDeclarationVisitor { public: WfLexicalScopeManager* manager; ITypeDescriptor* tdDescriptableObject = description::GetTypeDescriptor(); ITypeDescriptor* tdIDescriptable = description::GetTypeDescriptor(); vint step = 0; Dictionary depItems; Group depGroup; CheckCycleDependencyDeclarationVisitor(WfLexicalScopeManager* _manager) :manager(_manager) { } void Dispatch(WfVirtualCfeDeclaration* node)override { FOREACH(Ptr, decl, node->expandedDeclarations) { decl->Accept(this); } } void Dispatch(WfVirtualCseDeclaration* node)override { node->Accept((WfVirtualCseDeclaration::IVisitor*)this); } void Visit(WfNamespaceDeclaration* node)override { FOREACH(Ptr, decl, node->declarations) { decl->Accept(this); } } void Visit(WfStructDeclaration* node)override { auto scope = manager->nodeScopes[node]; auto td = manager->declarationTypes[node].Obj(); if (step == 1) { depItems.Add(td, node); } else if (step == 2) { vint count = td->GetPropertyCount(); for (vint i = 0; i < count; i++) { auto propType = td->GetProperty(i)->GetReturn(); if (propType->GetDecorator() == ITypeInfo::TypeDescriptor) { auto propTd = propType->GetTypeDescriptor(); if (!depItems.Keys().Contains(propTd)) continue; if (td == propTd) { List tds; tds.Add(td); manager->errors.Add(WfErrors::StructRecursivelyIncludeItself(node, tds)); } else if (propTd->GetTypeDescriptorFlags() == TypeDescriptorFlags::Struct) { if (!depGroup.Contains(td, propTd)) { depGroup.Add(td, propTd); } } } } } } void Visit(WfClassDeclaration* node)override { auto scope = manager->nodeScopes[node]; auto td = manager->declarationTypes[node].Obj(); if (step == 1) { depItems.Add(td, node); } else if (step == 2) { vint count = td->GetBaseTypeDescriptorCount(); for (vint i = 0; i < count; i++) { auto baseTd = td->GetBaseTypeDescriptor(i); 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(baseTd) && baseTd != tdDescriptableObject) { manager->errors.Add(WfErrors::WrongBaseTypeOfClass(node, baseTd)); } } } break; case WfClassKind::Interface: { if (!isInterface && baseTd != tdIDescriptable) { manager->errors.Add(WfErrors::WrongBaseTypeOfInterface(node, baseTd)); } } break; } if (!depItems.Keys().Contains(baseTd)) continue; if (baseTd == td) { List tds; tds.Add(td); if (isClass) { manager->errors.Add(WfErrors::ClassRecursiveInheritance(node, tds)); } else if (isInterface) { manager->errors.Add(WfErrors::InterfaceRecursiveInheritance(node, tds)); } } else if (baseTd->GetTypeDescriptorFlags() == td->GetTypeDescriptorFlags()) { if (!depGroup.Contains(td, baseTd)) { depGroup.Add(td, baseTd); } } } } FOREACH(Ptr, memberDecl, node->declarations) { memberDecl->Accept(this); } } void Execute(vint _step) { step = _step; FOREACH(Ptr, module, manager->GetModules()) { FOREACH(Ptr, declaration, module->declarations) { declaration->Accept(this); } } } void ExecuteCollectTypes() { Execute(1); } void ExecuteCollectDependencies() { Execute(2); } }; /*********************************************************************** CheckScopes_CycleDependency ***********************************************************************/ void CheckScopes_DuplicatedBaseClass(WfLexicalScopeManager* manager, WfClassDeclaration* node, ITypeDescriptor* td) { List baseTypes; SortedList 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()) { if (baseTypes.Contains(baseTd)) { if (!duplicatedTypes.Contains(baseTd)) { duplicatedTypes.Add(baseTd); manager->errors.Add(WfErrors::DuplicatedBaseClass(node, baseTd)); } } else { baseTypes.Add(baseTd); } } } } } bool CheckScopes_CycleDependency(WfLexicalScopeManager* manager) { vint errorCount = manager->errors.Count(); CheckCycleDependencyDeclarationVisitor visitor(manager); visitor.ExecuteCollectTypes(); visitor.ExecuteCollectDependencies(); { PartialOrderingProcessor pop; pop.InitWithGroup(visitor.depItems.Keys(), visitor.depGroup); pop.Sort(); for (vint i = 0; i < pop.components.Count(); i++) { auto& component = pop.components[i]; if (component.nodeCount > 1) { List tds; CopyFrom( tds, From(component.firstNode, component.firstNode + component.nodeCount) .Select([&](vint nodeIndex) { return visitor.depItems.Keys()[nodeIndex]; }) ); switch (tds[0]->GetTypeDescriptorFlags()) { case TypeDescriptorFlags::Struct: manager->errors.Add(WfErrors::StructRecursivelyIncludeItself(dynamic_cast(visitor.depItems[tds[0]]), tds)); break; case TypeDescriptorFlags::Class: manager->errors.Add(WfErrors::ClassRecursiveInheritance(dynamic_cast(visitor.depItems[tds[0]]), tds)); break; case TypeDescriptorFlags::Interface: manager->errors.Add(WfErrors::InterfaceRecursiveInheritance(dynamic_cast(visitor.depItems[tds[0]]), tds)); break; default:; } } } } if (errorCount == manager->errors.Count()) { for (vint i = 0; i < visitor.depItems.Count(); i++) { auto key = visitor.depItems.Keys()[i]; auto value = dynamic_cast(visitor.depItems.Values()[i]); if (value && value->kind == WfClassKind::Class) { CheckScopes_DuplicatedBaseClass(manager, value, key); } } } return errorCount == manager->errors.Count(); } } } } /*********************************************************************** .\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 _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 WfLexicalScope::FindModule() { WfLexicalScope* scope = this; while (scope) { if (auto module = scope->ownerNode.Cast()) { 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()) { return L"<" + module->name.value + L">"; } else if (auto decl = ownerNode.Cast()) { auto name = decl->name.value; if (name == L"") { name = L""; } return parentScope->GetFriendlyName() + L"::" + name; } else if (!parentScope) { return L""; } else { return parentScope->GetFriendlyName() + L"::<>"; } } Ptr WfLexicalScope::GetOwnerClassMember() { if (auto decl = ownerNode.Cast()) { return decl->classMember; } return nullptr; } /*********************************************************************** WfLexicalScopeName ***********************************************************************/ WfLexicalScopeName::WfLexicalScopeName(bool _imported) :imported(_imported) { } WfLexicalScopeName::~WfLexicalScopeName() { } Ptr WfLexicalScopeName::AccessChild(const WString& name, bool imported) { vint index = children.Keys().IndexOf(name); if (index == -1) { Ptr 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, 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""; } if (result.Length() > 0 && upperCase) { result = INVLOC.ToUpper(result.Left(1)) + result.Right(result.Length() - 1); } return result; } ResolveExpressionResult ResolveExpressionResult::ScopeName(Ptr _scopeName) { ResolveExpressionResult result; result.scopeName = _scopeName; return result; } ResolveExpressionResult ResolveExpressionResult::ReadonlySymbol(Ptr _symbol) { ResolveExpressionResult result; result.symbol = _symbol; result.type = _symbol->typeInfo; return result; } ResolveExpressionResult ResolveExpressionResult::Symbol(Ptr _symbol) { ResolveExpressionResult result; result.symbol = _symbol; result.type = _symbol->typeInfo; if (_symbol->creatorNode.Cast()) { result.writableType = _symbol->typeInfo; } return result; } ResolveExpressionResult ResolveExpressionResult::ReadonlyType(Ptr _type) { ResolveExpressionResult result; result.type = _type; return result; } ResolveExpressionResult ResolveExpressionResult::WritableType(Ptr _type) { ResolveExpressionResult result; result.type = _type; result.writableType = _type; return result; } ResolveExpressionResult ResolveExpressionResult::Property(reflection::description::IPropertyInfo* _propertyInfo) { Ptr getterType = CopyTypeInfo(_propertyInfo->GetReturn()); Ptr setterType; if (getterType) { 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 _parsingTable) :parsingTable(_parsingTable) { attributes.Add({ L"cpp", L"File" }, TypeInfoRetriver::CreateTypeInfo()); attributes.Add({ L"cpp", L"UserImpl" }, TypeInfoRetriver::CreateTypeInfo()); attributes.Add({ L"cpp", L"Private" }, TypeInfoRetriver::CreateTypeInfo()); attributes.Add({ L"cpp", L"Protected" }, TypeInfoRetriver::CreateTypeInfo()); attributes.Add({ L"cpp", L"Friend" }, TypeInfoRetriver::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 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(); checkedScopes_DuplicatedSymbol.Clear(); checkedScopes_SymbolType.Clear(); expressionResolvings.Clear(); coNewCoroutineResolvings.Clear(); coOperatorResolvings.Clear(); coProviderResolvings.Clear(); coCastResultResolvings.Clear(); baseConstructorCallResolvings.Clear(); lambdaCaptures.Clear(); interfaceMethodImpls.Clear(); declaractionScopeSources.Clear(); declarationTypes.Clear(); declarationMemberInfos.Clear(); stateInputMethods.Clear(); stateInputArguments.Clear(); stateDeclArguments.Clear(); stateMachineInfos.Clear(); } #define EXECUTE_CALLBACK(EXPR) if (callback) callback->EXPR void WfLexicalScopeManager::Rebuild(bool keepTypeDescriptorNames, IWfCompilerCallback* callback) { EXECUTE_CALLBACK(OnLoadEnvironment()); Clear(keepTypeDescriptorNames, false); if (!globalName) { globalName = new WfLexicalScopeName(true); BuildGlobalNameFromTypeDescriptors(this); } EXECUTE_CALLBACK(OnInitialize(this)); vint errorCount = errors.Count(); #define EXIT_IF_ERRORS_EXIST\ do\ {\ if (errors.Count() != errorCount) return;\ }while (0) EXIT_IF_ERRORS_EXIST; FOREACH(Ptr, module, modules) { ContextFreeModuleDesugar(this, module); ValidateModuleStructure(this, module); } EXIT_IF_ERRORS_EXIST; BuildGlobalNameFromModules(this); FOREACH(Ptr, module, modules) { BuildScopeForModule(this, module); } ValidateScopeName(this, globalName); CheckScopes_DuplicatedSymbol(this); EXIT_IF_ERRORS_EXIST; FOREACH(Ptr, module, modules) { CompleteScopeForModule(this, module); } CheckScopes_SymbolType(this); CheckScopes_CycleDependency(this); EXIT_IF_ERRORS_EXIST; FOREACH(Ptr, module, modules) { EXECUTE_CALLBACK(OnValidateModule(module)); ValidateModuleSemantic(this, module); } #undef EXIT_IF_ERRORS_EXIST } #undef EXECUTE_CALLBACK bool WfLexicalScopeManager::ResolveMember(ITypeDescriptor* typeDescriptor, const WString& name, bool preferStatic, collections::SortedList& searchedTypes, collections::List& 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(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 fragment, const WString& name) { UsingPathToNameVisitor visitor(name); fragment->Accept(&visitor); return visitor.result; } }; bool WfLexicalScopeManager::ResolveName(WfLexicalScope* scope, const WString& name, collections::List& results) { vint oldResultCount = results.Count(); bool visibleToNonStatic = false; WfLexicalScope* firstConfigScope = nullptr; while (scope) { if (scope->ownerNode.Cast() || scope->ownerNode.Cast()) { 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()) { FOREACH(Ptr, symbol, scope->symbols.GetByIndex(index)) { if (symbol->creatorNode.Cast()) { auto result = ResolveExpressionResult::Symbol(symbol); if (!results.Contains(result)) { results.Add(result); } } else if (symbol->creatorNode.Cast()->classMember->kind == WfClassMemberKind::Normal) { if (firstConfigScope->parentScope == scope) { auto result = ResolveExpressionResult::Symbol(symbol); if (!results.Contains(result)) { results.Add(result); } } } } } } else { FOREACH(Ptr, symbol, scope->symbols.GetByIndex(index)) { auto result = ResolveExpressionResult::Symbol(symbol); if (!results.Contains(result)) { results.Add(result); } } } } if (scope->typeOfThisExpr) { SortedList searchedTypes; ResolveMember(scope->typeOfThisExpr, name, !visibleToNonStatic, searchedTypes, results); } scope = scope->parentScope.Obj(); } while (scope) { if (auto nsDecl = scope->ownerNode.Cast()) { 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()) { FOREACH(Ptr, path, module->paths) { auto scopeName = globalName; FOREACH(Ptr, item, path->items) { WString fragmentName; FOREACH(Ptr, 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 WfLexicalScopeManager::GetDeclarationSymbol(WfLexicalScope* scope, WfDeclaration* node) { auto symbol = From(scope->parentScope->symbols[node->name.value]) .Where([=](Ptr symbol) { return symbol->creatorNode == node; }) .First(); return symbol; } void WfLexicalScopeManager::CreateLambdaCapture(parsing::ParsingTreeCustomBase* node, Ptr capture) { if (!capture) { capture = MakePtr(); } lambdaCaptures.Add(node, capture); } } } } /*********************************************************************** .\ANALYZER\WFANALYZER_BUILDGLOBALNAMEFROMMODULES.CPP ***********************************************************************/ namespace vl { namespace workflow { namespace analyzer { using namespace reflection::description; using namespace typeimpl; /*********************************************************************** BuildGlobalNameFromModules ***********************************************************************/ class BuildClassMemberVisitor : public Object , public WfDeclaration::IVisitor , public WfVirtualCseDeclaration::IVisitor { public: WfLexicalScopeManager* manager; Ptr scopeName; Ptr classDecl; Ptr td; BuildClassMemberVisitor(WfLexicalScopeManager* _manager, Ptr _scopeName, Ptr _classDecl, Ptr _td) :manager(_manager) , scopeName(_scopeName) , classDecl(_classDecl) , td(_td) { } static WString GetTypeName(WfLexicalScopeManager* manager, Ptr 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 scopeName, Ptr declaration, Ptr 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 scopeName, Ptr declaration) { WString typeName = GetTypeName(manager, scopeName); Ptr td; switch (declaration->kind) { case WfClassKind::Class: td = MakePtr(typeName); break; case WfClassKind::Interface: td = MakePtr(typeName); break; } AddCustomType(manager, scopeName, declaration, td); FOREACH(Ptr, 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(); td->AddMember(node->name.value, info); manager->declarationMemberInfos.Add(node, info); } else { switch (classDecl->kind) { case WfClassKind::Class: { auto info = MakePtr(); td->AddMember(node->name.value, info); manager->declarationMemberInfos.Add(node, info); } break; case WfClassKind::Interface: { auto info = MakePtr(); td->AddMember(node->name.value, info); manager->declarationMemberInfos.Add(node, info); } break; } } } void Visit(WfVariableDeclaration* node)override { auto info = MakePtr(td.Obj(), node->name.value); td->AddMember(info); manager->declarationMemberInfos.Add(node, info); } void Visit(WfEventDeclaration* node)override { auto info = MakePtr(td.Obj(), node->name.value); td->AddMember(info); manager->declarationMemberInfos.Add(node, info); } void Visit(WfPropertyDeclaration* node)override { auto info = MakePtr(td.Obj(), node->name.value); td->AddMember(info); manager->declarationMemberInfos.Add(node, info); } void Visit(WfConstructorDeclaration* node)override { Ptr typeInfo; { auto elementType = MakePtr(td.Obj(), TypeInfoHint::Normal); if (node->constructorType == WfConstructorType::RawPtr) { typeInfo = MakePtr(elementType); } else { typeInfo = MakePtr(elementType); } } auto info = MakePtr(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(WfVirtualCfeDeclaration* node)override { FOREACH(Ptr, decl, node->expandedDeclarations) { decl->Accept(this); } } void Visit(WfVirtualCseDeclaration* node)override { node->Accept((WfVirtualCseDeclaration::IVisitor*)this); } void Visit(WfStateMachineDeclaration* node)override { FOREACH(Ptr, input, node->inputs) { auto info = MakePtr(); td->AddMember(input->name.value, info); manager->stateInputMethods.Add(input, info); FOREACH(Ptr, argument, input->arguments) { auto info = MakePtr(td.Obj(), L"name.value + L">" + argument->name.value); td->AddMember(info); manager->stateInputArguments.Add(argument.Obj(), info); } } FOREACH(Ptr, state, node->states) { FOREACH(Ptr, argument, state->arguments) { auto info = MakePtr(td.Obj(), L"name.value + L">" + argument->name.value); td->AddMember(info); manager->stateDeclArguments.Add(argument.Obj(), info); } } auto smInfo = MakePtr(); { smInfo->createCoroutineMethod = MakePtr(); td->AddMember(L"CreateCoroutine", smInfo->createCoroutineMethod); } manager->stateMachineInfos.Add(node, smInfo); } }; class BuildNameDeclarationVisitor : public empty_visitor::DeclarationVisitor , public empty_visitor::VirtualCseDeclarationVisitor { public: WfLexicalScopeManager* manager; Ptr scopeName; BuildNameDeclarationVisitor(WfLexicalScopeManager* _manager, Ptr _scopeName) :manager(_manager) , scopeName(_scopeName) { } void Dispatch(WfVirtualCfeDeclaration* node)override { FOREACH(Ptr, decl, node->expandedDeclarations) { decl->Accept(this); } } void Dispatch(WfVirtualCseDeclaration* node)override { node->Accept((WfVirtualCseDeclaration::IVisitor*)this); } void Visit(WfNamespaceDeclaration* node)override { manager->namespaceNames.Add(node, scopeName); FOREACH(Ptr, 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(node->kind == WfEnumKind::Flag, BuildClassMemberVisitor::GetTypeName(manager, scopeName)); BuildClassMemberVisitor::AddCustomType(manager, scopeName, node, td); } void Visit(WfStructDeclaration* node)override { auto td = MakePtr(BuildClassMemberVisitor::GetTypeName(manager, scopeName)); BuildClassMemberVisitor::AddCustomType(manager, scopeName, node, td); } }; void BuildNameForDeclaration(WfLexicalScopeManager* manager, Ptr 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, module, manager->GetModules()) { FOREACH(Ptr, decl, module->declarations) { BuildNameForDeclaration(manager, manager->globalName, decl.Obj()); } } } } } } /*********************************************************************** .\ANALYZER\WFANALYZER_BUILDGLOBALNAMEFROMTYPEDESCRIPTORS.CPP ***********************************************************************/ namespace vl { namespace workflow { namespace analyzer { using namespace reflection::description; /*********************************************************************** 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 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; } } } } } } } /*********************************************************************** .\ANALYZER\WFANALYZER_BUILDSCOPE.CPP ***********************************************************************/ namespace vl { namespace workflow { namespace analyzer { using namespace collections; using namespace parsing; using namespace reflection::description; /*********************************************************************** BuildScopeForDeclaration ***********************************************************************/ class BuildScopeForDeclarationVisitor : public Object , public WfDeclaration::IVisitor , public WfVirtualCseDeclaration::IVisitor { public: WfLexicalScopeManager* manager; ParsingTreeCustomBase* source; Ptr parentScope; Ptr resultScope; BuildScopeForDeclarationVisitor(WfLexicalScopeManager* _manager, Ptr _parentScope, ParsingTreeCustomBase* _source) :manager(_manager) , source(_source) , parentScope(_parentScope) { } void Visit(Ptr scope, List>& attributes) { FOREACH(Ptr, attribute, attributes) { if (attribute->value) { BuildScopeForExpression(manager, scope, attribute->value); } } } void Visit(WfNamespaceDeclaration* node)override { Ptr 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, declaration, node->declarations) { BuildScopeForDeclaration(manager, resultScope, declaration, node); } } void Visit(WfFunctionDeclaration* node)override { resultScope = new WfLexicalScope(parentScope); auto config = MakePtr(); resultScope->functionConfig = config; resultScope->ownerNodeSource = source; if (source) { if (dynamic_cast(source)) { config->lambda = true; config->thisAccessable = false; config->parentThisAccessable = true; } else if (dynamic_cast(source)) { config->lambda = true; config->thisAccessable = true; config->parentThisAccessable = true; } else if (dynamic_cast(source)) { config->lambda = false; config->thisAccessable = node->classMember->kind != WfClassMemberKind::Static; config->parentThisAccessable = false; } } if (node->anonymity == WfFunctionAnonymity::Named) { Ptr functionNameScope = parentScope; if (source && dynamic_cast(source)) { functionNameScope = resultScope; } Ptr symbol = new WfLexicalSymbol(functionNameScope.Obj()); symbol->name = node->name.value; symbol->creatorNode = node; { Ptr type = new WfFunctionType; type->result = node->returnType; FOREACH(Ptr, argument, node->arguments) { type->arguments.Add(argument->type); } symbol->type = type; } functionNameScope->symbols.Add(symbol->name, symbol); } if (node->statement) { FOREACH(Ptr, argument, node->arguments) { Ptr 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 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 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 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, argument, node->arguments) { Ptr 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, call, node->baseConstructorCalls) { FOREACH(Ptr, argument, call->arguments) { BuildScopeForExpression(manager, resultScope, argument); } } auto bodyScope = MakePtr(resultScope); { auto config = MakePtr(); 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(); resultScope->functionConfig = config; config->lambda = false; config->thisAccessable = true; config->parentThisAccessable = false; } BuildScopeForStatement(manager, resultScope, node->statement); } void Visit(WfClassDeclaration* node)override { Ptr 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, memberDecl, node->declarations) { BuildScopeForDeclaration(manager, resultScope, memberDecl, node); } } void Visit(WfEnumDeclaration* node)override { Ptr symbol = new WfLexicalSymbol(parentScope.Obj()); symbol->name = node->name.value; symbol->creatorNode = node; parentScope->symbols.Add(symbol->name, symbol); FOREACH(Ptr, item, node->items) { Visit(parentScope, item->attributes); } } void Visit(WfStructDeclaration* node)override { Ptr symbol = new WfLexicalSymbol(parentScope.Obj()); symbol->name = node->name.value; symbol->creatorNode = node; parentScope->symbols.Add(symbol->name, symbol); FOREACH(Ptr, member, node->members) { Visit(parentScope, member->attributes); } } void Visit(WfVirtualCfeDeclaration* node)override { FOREACH(Ptr, decl, node->expandedDeclarations) { Execute(manager, parentScope, source, decl); } } void Visit(WfVirtualCseDeclaration* node)override { node->Accept((WfVirtualCseDeclaration::IVisitor*)this); } void Visit(WfStateMachineDeclaration* node)override { FOREACH(Ptr, input, node->inputs) { Ptr stateSymbol = new WfLexicalSymbol(parentScope.Obj()); stateSymbol->name = input->name.value; stateSymbol->creatorNode = input; parentScope->symbols.Add(stateSymbol->name, stateSymbol); } FOREACH(Ptr, state, node->states) { Ptr stateSymbol = new WfLexicalSymbol(parentScope.Obj()); stateSymbol->name = state->name.value; stateSymbol->creatorNode = state; parentScope->symbols.Add(stateSymbol->name, stateSymbol); auto stateScope = MakePtr(parentScope); { auto config = MakePtr(); stateScope->functionConfig = config; config->lambda = false; config->thisAccessable = true; config->parentThisAccessable = true; } stateScope->ownerNode = state; manager->nodeScopes.Add(state.Obj(), stateScope); FOREACH(Ptr, argument, state->arguments) { Ptr argumentSymbol = new WfLexicalSymbol(stateScope.Obj()); argumentSymbol->name = argument->name.value; argumentSymbol->type = argument->type; argumentSymbol->creatorNode = argument; stateScope->symbols.Add(argumentSymbol->name, argumentSymbol); } BuildScopeForStatement(manager, stateScope, state->statement); } } static Ptr Execute(WfLexicalScopeManager* manager, Ptr parentScope, ParsingTreeCustomBase* source, Ptr declaration) { BuildScopeForDeclarationVisitor visitor(manager, parentScope, source); declaration->Accept(&visitor); visitor.Visit(parentScope, declaration->attributes); manager->declaractionScopeSources.Add(declaration, source); 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 WfVirtualCseStatement::IVisitor , public WfCoroutineStatement::IVisitor , public WfStateMachineStatement::IVisitor { public: WfLexicalScopeManager* manager; Ptr parentScope; Ptr resultScope; BuildScopeForStatementVisitor(WfLexicalScopeManager* _manager, Ptr _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 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 symbol = new WfLexicalSymbol(resultScope.Obj()); symbol->name = node->name.value; symbol->creatorNode = node; { auto system = MakePtr(); system->name.value = L"system"; auto exception = MakePtr(); exception->parent = system; exception->name.value = L"Exception"; auto sharedPtr = MakePtr(); 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, statement, node->statements) { BuildScopeForStatement(manager, resultScope, statement); } } void Visit(WfGotoStatement* node)override { } void Visit(WfExpressionStatement* node)override { BuildScopeForExpression(manager, parentScope, node->expression); } void Visit(WfVariableStatement* node)override { BuildScopeForDeclaration(manager, parentScope, node->variable, node); } void Visit(WfVirtualCseStatement* node)override { node->Accept((WfVirtualCseStatement::IVisitor*)this); } void Visit(WfSwitchStatement* node)override { BuildScopeForExpression(manager, parentScope, node->expression); FOREACH(Ptr, 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 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 symbol = new WfLexicalSymbol(resultScope.Obj()); symbol->name = L"$PROVIDER"; symbol->creatorNode = node; resultScope->symbols.Add(symbol->name, symbol); } { Ptr 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 symbol = new WfLexicalSymbol(parentScope.Obj()); symbol->name = node->varName.value; symbol->creatorNode = node; parentScope->symbols.Add(symbol->name, symbol); } FOREACH(Ptr, argument, node->arguments) { BuildScopeForExpression(manager, parentScope, argument); } } void Visit(WfStateMachineStatement* node)override { node->Accept((WfStateMachineStatement::IVisitor*)this); } void Visit(WfStateSwitchStatement* node)override { resultScope = new WfLexicalScope(parentScope); FOREACH(Ptr, switchCase, node->caseBranches) { auto caseScope = MakePtr(resultScope); caseScope->ownerNode = switchCase; manager->nodeScopes.Add(switchCase.Obj(), caseScope); FOREACH(Ptr, argument, switchCase->arguments) { Ptr symbol = new WfLexicalSymbol(caseScope.Obj()); symbol->name = argument->name.value; symbol->creatorNode = argument; caseScope->symbols.Add(symbol->name, symbol); } BuildScopeForStatement(manager, caseScope, switchCase->statement); } } void Visit(WfStateInvokeStatement* node)override { FOREACH(Ptr, argument, node->arguments) { BuildScopeForExpression(manager, parentScope, argument); } } static Ptr Execute(WfLexicalScopeManager* manager, Ptr parentScope, Ptr 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 WfVirtualCseExpression::IVisitor { public: WfLexicalScopeManager* manager; Ptr parentScope; Ptr resultScope; BuildScopeForExpressionVisitor(WfLexicalScopeManager* _manager, Ptr _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 names; SearchOrderedName(parentScope.Obj(), node->body, names); resultScope = new WfLexicalScope(parentScope); auto config = MakePtr(); resultScope->functionConfig = config; config->lambda = true; config->thisAccessable = false; config->parentThisAccessable = true; FOREACH(vint, name, names) { Ptr 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, variable, node->variables) { Ptr 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, 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, event, node->events) { BuildScopeForExpression(manager, parentScope, event); } } else { resultScope = new WfLexicalScope(parentScope); { Ptr 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, event, node->events) { BuildScopeForExpression(manager, resultScope, event); } } } void Visit(WfCallExpression* node)override { BuildScopeForExpression(manager, parentScope, node->function); FOREACH(Ptr, 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, argument, node->arguments) { BuildScopeForExpression(manager, parentScope, argument); } } class CreateLambdaCaptureVisitor : public empty_visitor::DeclarationVisitor { public: WfLexicalScopeManager* manager; Ptr capture; CreateLambdaCaptureVisitor(WfLexicalScopeManager* _manager, Ptr _capture) :manager(_manager) , capture(_capture) { } void Dispatch(WfVirtualCfeDeclaration* node)override { FOREACH(Ptr, decl, node->expandedDeclarations) { decl->Accept(this); } } void Dispatch(WfVirtualCseDeclaration* node)override { } void Visit(WfFunctionDeclaration* node)override { manager->CreateLambdaCapture(node, capture); } }; void Visit(WfNewInterfaceExpression* node)override { resultScope = new WfLexicalScope(parentScope); auto capture = MakePtr(); manager->CreateLambdaCapture(node, capture); CreateLambdaCaptureVisitor visitor(manager, capture); FOREACH(Ptr, memberDecl, node->declarations) { memberDecl->Accept(&visitor); BuildScopeForDeclaration(manager, resultScope, memberDecl, node); } } void Visit(WfVirtualCfeExpression* node)override { BuildScopeForExpression(manager, parentScope, node->expandedExpression); } void Visit(WfVirtualCseExpression* node)override { node->Accept((WfVirtualCseExpression::IVisitor*)this); } void Visit(WfBindExpression* node)override { BuildScopeForExpression(manager, parentScope, node->expression); } void Visit(WfNewCoroutineExpression* node)override { manager->CreateLambdaCapture(node); resultScope = new WfLexicalScope(parentScope); auto config = MakePtr(); resultScope->functionConfig = config; if (node->name.value != L"") { Ptr symbol = new WfLexicalSymbol(resultScope.Obj()); symbol->name = node->name.value; symbol->creatorNode = node; symbol->typeInfo = TypeInfoRetriver>::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); } void Visit(WfExpectedTypeCastExpression* node)override { BuildScopeForExpression(manager, parentScope, node->expression); } void Visit(WfCoOperatorExpression* node)override { } static Ptr Execute(WfLexicalScopeManager* manager, Ptr parentScope, Ptr 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 module) { Ptr scope = new WfLexicalScope(manager); scope->ownerNode = module; manager->nodeScopes.Add(module.Obj(), scope); FOREACH(Ptr, declaration, module->declarations) { BuildScopeForDeclaration(manager, scope, declaration, module.Obj()); } } void BuildScopeForDeclaration(WfLexicalScopeManager* manager, Ptr parentScope, Ptr declaration, parsing::ParsingTreeCustomBase* source) { BuildScopeForDeclarationVisitor::Execute(manager, parentScope, source, declaration); } void BuildScopeForStatement(WfLexicalScopeManager* manager, Ptr parentScope, Ptr statement) { BuildScopeForStatementVisitor::Execute(manager, parentScope, statement); } void BuildScopeForExpression(WfLexicalScopeManager* manager, Ptr parentScope, Ptr expression) { BuildScopeForExpressionVisitor::Execute(manager, parentScope, expression); } } } } /*********************************************************************** .\ANALYZER\WFANALYZER_CHECKSCOPE_DUPLICATEDSYMBOL.CPP ***********************************************************************/ namespace vl { namespace workflow { namespace analyzer { using namespace collections; /*********************************************************************** CheckScopes_DuplicatedSymbol ***********************************************************************/ bool CheckScopes_DuplicatedSymbol(WfLexicalScopeManager* manager) { vint errorCount = manager->errors.Count(); FOREACH(Ptr, scope, manager->nodeScopes.Values()) { if (!manager->checkedScopes_DuplicatedSymbol.Contains(scope.Obj())) { manager->checkedScopes_DuplicatedSymbol.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() && !scope->ownerNode.Cast()) { if (symbols.Count() > 1) { FOREACH(Ptr, symbol, From(symbols)) { if (auto decl = symbol->creatorNode.Cast()) { if (!decl.Cast()) { manager->errors.Add(WfErrors::DuplicatedSymbol(decl.Obj(), symbol)); } } else if (auto arg = symbol->creatorNode.Cast()) { manager->errors.Add(WfErrors::DuplicatedSymbol(arg.Obj(), symbol)); } else if (auto stat = symbol->creatorNode.Cast()) { manager->errors.Add(WfErrors::DuplicatedSymbol(stat.Obj(), symbol)); } else if (auto expr = symbol->creatorNode.Cast()) { manager->errors.Add(WfErrors::DuplicatedSymbol(expr.Obj(), symbol)); } else if (auto input = symbol->creatorNode.Cast()) { if (symbols.Count() == 2) { // Ignore the generated function from the state input auto methodSymbol = symbols[1 - symbols.IndexOf(symbol.Obj())]; auto funcDecl = methodSymbol->creatorNode.Cast(); vint index = manager->declarationMemberInfos.Keys().IndexOf(funcDecl.Obj()); if (index != -1) { auto methodInfo = manager->declarationMemberInfos.Values()[index]; if (manager->stateInputMethods[input.Obj()].Obj() == methodInfo.Obj()) { goto NO_ERROR; } } } manager->errors.Add(WfErrors::DuplicatedSymbol(input.Obj(), symbol)); NO_ERROR:; } else if (auto state = symbol->creatorNode.Cast()) { manager->errors.Add(WfErrors::DuplicatedSymbol(state.Obj(), symbol)); } else if (auto sarg = symbol->creatorNode.Cast()) { manager->errors.Add(WfErrors::DuplicatedSymbol(sarg.Obj(), symbol)); } } } } } } } } return errorCount == manager->errors.Count(); } } } } /*********************************************************************** .\ANALYZER\WFANALYZER_CHECKSCOPE_SYMBOLTYPE.CPP ***********************************************************************/ namespace vl { namespace workflow { namespace analyzer { using namespace collections; /*********************************************************************** CheckScopes_SymbolType ***********************************************************************/ bool CheckScopes_SymbolType(WfLexicalScopeManager* manager) { vint errorCount = manager->errors.Count(); FOREACH(Ptr, scope, manager->nodeScopes.Values()) { if (!manager->checkedScopes_SymbolType.Contains(scope.Obj())) { manager->checkedScopes_SymbolType.Add(scope.Obj()); for (vint i = 0; i < scope->symbols.Count(); i++) { FOREACH(Ptr, symbol, scope->symbols.GetByIndex(i)) { if (symbol->type) { vint currentErrorCount = manager->errors.Count(); symbol->typeInfo = CreateTypeInfoFromType(scope.Obj(), symbol->type); if (symbol->creatorNode) { for (vint i = currentErrorCount; i < manager->errors.Count(); i++) { manager->errors[i]->parsingTree = symbol->creatorNode.Obj(); } } } } } } } 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 WfVirtualCseDeclaration::IVisitor { public: WfLexicalScopeManager* manager; Ptr td; Ptr classDecl; CompleteScopeForClassMemberVisitor(WfLexicalScopeManager* _manager, Ptr _td, Ptr _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(); FOREACH(Ptr, argument, node->arguments) { if (auto typeInfo = CreateTypeInfoFromType(scope.Obj(), argument->type)) { auto paramInfo = MakePtr(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(); info->SetReturn(typeInfo); } } void Visit(WfEventDeclaration* node)override { auto scope = manager->nodeScopes[node]; auto type = MakePtr(); { auto voidType = MakePtr(); voidType->name = WfPredefinedTypeName::Void; type->result = voidType; } FOREACH(Ptr, argument, node->arguments) { type->arguments.Add(argument); } if (auto typeInfo = CreateTypeInfoFromType(scope.Obj(), type)) { auto info = manager->declarationMemberInfos[node].Cast(); info->SetHandlerType(typeInfo); } } void Visit(WfPropertyDeclaration* node)override { auto scope = manager->nodeScopes[node]; auto info = manager->declarationMemberInfos[node].Cast(); if (node->getter.value != L"") { info->SetGetter(dynamic_cast(td->GetMethodGroupByName(node->getter.value, false)->GetMethod(0))); } if (node->setter.value != L"") { info->SetSetter(dynamic_cast(td->GetMethodGroupByName(node->setter.value, false)->GetMethod(0))); } if (node->valueChangedEvent.value != L"") { info->SetValueChangedEvent(dynamic_cast(td->GetEventByName(node->valueChangedEvent.value, false))); } } void Visit(WfConstructorDeclaration* node)override { auto scope = manager->nodeScopes[node]; auto info = manager->declarationMemberInfos[node].Cast(); FOREACH(Ptr, argument, node->arguments) { if (auto typeInfo = CreateTypeInfoFromType(scope.Obj(), argument->type)) { auto paramInfo = MakePtr(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(WfVirtualCfeDeclaration* node)override { FOREACH(Ptr, decl, node->expandedDeclarations) { decl->Accept(this); } } void Visit(WfVirtualCseDeclaration* node)override { node->Accept((WfVirtualCseDeclaration::IVisitor*)this); } void Visit(WfStateMachineDeclaration* node)override { auto scope = manager->nodeScopes[node]; FOREACH(Ptr, input, node->inputs) { auto method = manager->stateInputMethods[input.Obj()]; method->SetReturn(TypeInfoRetriver::CreateTypeInfo()); FOREACH(Ptr, argument, input->arguments) { if (auto typeInfo = CreateTypeInfoFromType(scope.Obj(), argument->type)) { auto field = manager->stateInputArguments[argument.Obj()]; field->SetReturn(typeInfo); method->AddParameter(MakePtr(method.Obj(), argument->name.value, typeInfo)); } } } FOREACH(Ptr, state, node->states) { FOREACH(Ptr, argument, state->arguments) { if (auto typeInfo = CreateTypeInfoFromType(scope.Obj(), argument->type)) { auto field = manager->stateDeclArguments[argument.Obj()]; field->SetReturn(typeInfo); } } } auto& smInfo = manager->stateMachineInfos[node]; smInfo->createCoroutineMethod->AddParameter(MakePtr(smInfo->createCoroutineMethod.Obj(), L"startState", TypeInfoRetriver::CreateTypeInfo())); smInfo->createCoroutineMethod->SetReturn(TypeInfoRetriver::CreateTypeInfo()); } static void Execute(WfLexicalScopeManager* manager, Ptr td, Ptr classDecl, Ptr memberDecl) { CompleteScopeForClassMemberVisitor visitor(manager, td, classDecl); memberDecl->Accept(&visitor); } }; /*********************************************************************** CompleteScopeForDeclaration ***********************************************************************/ class CompleteScopeForDeclarationVisitor : public Object , public WfDeclaration::IVisitor , public WfVirtualCseDeclaration::IVisitor { public: WfLexicalScopeManager* manager; Ptr declaration; CompleteScopeForDeclarationVisitor(WfLexicalScopeManager* _manager, Ptr _declaration) :manager(_manager) , declaration(_declaration) { } void Visit(WfNamespaceDeclaration* node)override { FOREACH(Ptr, 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(); if (node->baseTypes.Count() > 0) { FOREACH(Ptr, 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()); } else if (node->kind == WfClassKind::Interface) { td->AddBaseType(description::GetTypeDescriptor()); } if (node->kind == WfClassKind::Interface) { switch (node->constructorType) { case WfConstructorType::SharedPtr: { auto elementType = MakePtr(td.Obj(), TypeInfoHint::Normal); auto pointerType = MakePtr(elementType); auto ctor = MakePtr(pointerType); td->AddMember(ctor); } break; case WfConstructorType::RawPtr: { auto elementType = MakePtr(td.Obj(), TypeInfoHint::Normal); auto pointerType = MakePtr(elementType); auto ctor = MakePtr(pointerType); td->AddMember(ctor); } break; default:; } } FOREACH(Ptr, memberDecl, node->declarations) { CompleteScopeForClassMember(manager, td, node, memberDecl); } } void Visit(WfEnumDeclaration* node)override { auto td = manager->declarationTypes[node].Cast(); Dictionary items; FOREACH(Ptr, item, node->items) { vuint64_t value = 0; switch (item->kind) { case WfEnumItemKind::Constant: TypedValueSerializerProvider::Deserialize(item->number.value, value); break; case WfEnumItemKind::Intersection: FOREACH(Ptr, 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(); FOREACH(Ptr, member, node->members) { if (auto typeInfo = CreateTypeInfoFromType(scope.Obj(), member->type)) { auto field = MakePtr(td.Obj(), member->name.value); field->SetReturn(typeInfo); td->AddMember(field); } } } void Visit(WfVirtualCfeDeclaration* node)override { FOREACH(Ptr, decl, node->expandedDeclarations) { decl->Accept(this); } } void Visit(WfVirtualCseDeclaration* node)override { node->Accept((WfVirtualCseDeclaration::IVisitor*)this); FOREACH(Ptr, decl, node->expandedDeclarations) { decl->Accept(this); } } void Visit(WfStateMachineDeclaration* node)override { } static void Execute(WfLexicalScopeManager* manager, Ptr declaration) { CompleteScopeForDeclarationVisitor visitor(manager, declaration); declaration->Accept(&visitor); } }; /*********************************************************************** CompleteScope ***********************************************************************/ void CompleteScopeForClassMember(WfLexicalScopeManager* manager, Ptr td, Ptr classDecl, Ptr memberDecl) { CompleteScopeForClassMemberVisitor::Execute(manager, td, classDecl, memberDecl); } void CompleteScopeForDeclaration(WfLexicalScopeManager* manager, Ptr declaration) { CompleteScopeForDeclarationVisitor::Execute(manager, declaration); } void CompleteScopeForModule(WfLexicalScopeManager* manager, Ptr module) { FOREACH(Ptr, declaration, module->declarations) { CompleteScopeForDeclaration(manager, declaration); } } } } } /*********************************************************************** .\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; bool asOffset; SetCodeRangeVisitor(ParsingTextRange _range, bool _asOffset) :range(_range) , asOffset(_asOffset) { } void UpdateTextPos(ParsingTextPos& pos) { if (pos.row == -1 || pos.column == -1) { pos = range.start; } else { if (pos.row == 0) { pos.column += range.start.column; } pos.row += range.start.row; } } void Traverse(ParsingTreeCustomBase* node)override { if (node->codeRange == ParsingTextRange()) { node->codeRange = range; } else if (asOffset) { UpdateTextPos(node->codeRange.start); UpdateTextPos(node->codeRange.end); if (node->codeRange.codeIndex == -1) { node->codeRange.codeIndex = range.codeIndex; } } } void Traverse(ParsingToken& token)override { if (token.codeRange == ParsingTextRange()) { token.codeRange = range; } else if (asOffset) { UpdateTextPos(token.codeRange.start); UpdateTextPos(token.codeRange.end); if (token.codeRange.codeIndex == -1) { token.codeRange.codeIndex = range.codeIndex; } } } }; void SetCodeRange(Ptr node, parsing::ParsingTextRange codeRange, bool asOffset) { SetCodeRangeVisitor(codeRange, asOffset).VisitField(node.Obj()); } void SetCodeRange(Ptr node, parsing::ParsingTextRange codeRange, bool asOffset) { SetCodeRangeVisitor(codeRange, asOffset).VisitField(node.Obj()); } void SetCodeRange(Ptr node, parsing::ParsingTextRange codeRange, bool asOffset) { SetCodeRangeVisitor(codeRange, asOffset).VisitField(node.Obj()); } void SetCodeRange(Ptr node, parsing::ParsingTextRange codeRange, bool asOffset) { SetCodeRangeVisitor(codeRange, asOffset).VisitField(node.Obj()); } void SetCodeRange(Ptr node, parsing::ParsingTextRange codeRange, bool asOffset) { SetCodeRangeVisitor(codeRange, asOffset).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> expressions; const wchar_t* reading = node->value.value.Buffer(); const wchar_t* textPosCounter = reading; ParsingTextPos formatPos = node->codeRange.start; formatPos.column += 2; while (*reading) { const wchar_t* begin = wcsstr(reading, L"$("); if (begin) { Ptr 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> errors; if (auto expression = WfParseExpression(input, manager->parsingTable, errors)) { expressions.Add(expression); while (textPosCounter++ < begin + 2) { switch (textPosCounter[-1]) { case '\n': formatPos.row++; formatPos.column = 0; break; default: formatPos.column++; break; } } SetCodeRange(expression, { formatPos,formatPos,node->codeRange.codeIndex }, true); } FOREACH(Ptr, 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 expression = new WfStringExpression; expression->codeRange = node->codeRange; expression->value.value = reading; expressions.Add(expression); } if (expressions.Count() > 0) { Ptr current = expressions[0]; FOREACH(Ptr, expression, From(expressions).Skip(1)) { Ptr binary = new WfBinaryExpression; binary->codeRange = node->codeRange; binary->first = current; binary->second = expression; binary->op = WfBinaryOperator::FlagAnd; 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"" + 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(); node->expandedDeclarations.Add(decl); decl->name.value = varName; decl->type = CopyType(node->type); decl->expression = CopyExpression(node->expression, true); auto att = MakePtr(); att->category.value = L"cpp"; att->name.value = L"Private"; decl->attributes.Add(att); } { auto decl = MakePtr(); node->expandedDeclarations.Add(decl); decl->anonymity = WfFunctionAnonymity::Named; decl->name.value = getterName; decl->returnType = CopyType(node->type); if (!needVirtual) { auto refExpr = MakePtr(); refExpr->name.value = varName; auto returnStat = MakePtr(); returnStat->expression = refExpr; auto block = MakePtr(); block->statements.Add(returnStat); decl->statement = block; } } if (!needVirtual || node->configConst == WfAPConst::Writable) { auto decl = MakePtr(); node->expandedDeclarations.Add(decl); decl->anonymity = WfFunctionAnonymity::Named; decl->name.value = setterName; if (node->configConst == WfAPConst::Readonly) { auto att = MakePtr(); att->category.value = L"cpp"; att->name.value = L"Protected"; decl->attributes.Add(att); } { auto argument = MakePtr(); argument->name.value = L""; argument->type = CopyType(node->type); decl->arguments.Add(argument); } { auto voidType = MakePtr(); voidType->name = WfPredefinedTypeName::Void; decl->returnType = voidType; } if (!needVirtual) { auto block = MakePtr(); decl->statement = block; auto createBinaryExpr = [&](WfBinaryOperator op) { auto refArgument = MakePtr(); refArgument->name.value = L""; auto refVar = MakePtr(); refVar->name.value = varName; auto binaryExpr = MakePtr(); binaryExpr->first = refVar; binaryExpr->second = refArgument; binaryExpr->op = op; return binaryExpr; }; if (node->configObserve == WfAPObserve::Observable) { auto ifStat = MakePtr(); ifStat->expression = createBinaryExpr(WfBinaryOperator::NE); auto trueBlock = MakePtr(); ifStat->trueBranch = trueBlock; { auto stat = MakePtr(); stat->expression = createBinaryExpr(WfBinaryOperator::Assign); trueBlock->statements.Add(stat); } { auto refEvent = MakePtr(); refEvent->name.value = eventName; auto callExpr = MakePtr(); callExpr->function = refEvent; auto stat = MakePtr(); stat->expression = callExpr; trueBlock->statements.Add(stat); } block->statements.Add(ifStat); } else { auto stat = MakePtr(); stat->expression = createBinaryExpr(WfBinaryOperator::Assign); block->statements.Add(stat); } } } if (needEvent) { auto decl = MakePtr(); node->expandedDeclarations.Add(decl); decl->name.value = eventName; } if (needProperty) { auto decl = MakePtr(); 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, decl, node->expandedDeclarations) { auto classMember = MakePtr(); 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(); 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(); decl->declarations.Add(funcDecl); { funcDecl->classMember = MakePtr(); funcDecl->classMember->kind = WfClassMemberKind::Static; } funcDecl->anonymity = WfFunctionAnonymity::Named; funcDecl->name.value = L"CastResult"; funcDecl->returnType = CopyType(node->elementType); { auto argument = MakePtr(); funcDecl->arguments.Add(argument); argument->name.value = L"value"; argument->type = GetTypeFromTypeInfo(TypeInfoRetriver::CreateTypeInfo().Obj()); } { auto block = MakePtr(); funcDecl->statement = block; auto refValue = MakePtr(); refValue->name.value = L"value"; auto castExpr = MakePtr(); castExpr->strategy = WfTypeCastingStrategy::Strong; castExpr->type = CopyType(node->elementType); castExpr->expression = refValue; auto stat = MakePtr(); stat->expression = castExpr; block->statements.Add(stat); } } { auto funcDecl = MakePtr(); decl->declarations.Add(funcDecl); { funcDecl->classMember = MakePtr(); funcDecl->classMember->kind = WfClassMemberKind::Static; } funcDecl->anonymity = WfFunctionAnonymity::Named; funcDecl->name.value = L"StoreResult"; funcDecl->returnType = GetTypeFromTypeInfo(TypeInfoRetriver::CreateTypeInfo().Obj()); { auto argument = MakePtr(); funcDecl->arguments.Add(argument); argument->name.value = L"value"; argument->type = CopyType(node->elementType); } { auto block = MakePtr(); funcDecl->statement = block; auto refValue = MakePtr(); refValue->name.value = L"value"; auto stat = MakePtr(); stat->expression = refValue; block->statements.Add(stat); } } SetCodeRange(Ptr(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 module) { ContextFreeDesugarVisitor(manager).VisitField(module.Obj()); } void ContextFreeDeclarationDesugar(WfLexicalScopeManager* manager, Ptr declaration) { ContextFreeDesugarVisitor(manager).VisitField(declaration.Obj()); } void ContextFreeStatementDesugar(WfLexicalScopeManager* manager, Ptr statement) { ContextFreeDesugarVisitor(manager).VisitField(statement.Obj()); } void ContextFreeExpressionDesugar(WfLexicalScopeManager* manager, Ptr 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 WfErrors::WrongFormatStringSyntax(WfExpression* node) { return new ParsingError(node, L"A0: Wrong format string syntax."); } Ptr WfErrors::WrongSimpleObserveExpression(WfExpression* node) { return new ParsingError(node, L"A1: Simple observe expression should observe a property under the observed object."); } Ptr WfErrors::WrongSimpleObserveEvent(WfExpression* node) { return new ParsingError(node, L"A2: Simple observe expression should react to an event under the observed object."); } Ptr WfErrors::EmptyObserveEvent(WfExpression* node) { return new ParsingError(node, L"A2: Observe expression should react to at least one event."); } Ptr WfErrors::ObserveNotInBind(WfExpression* node) { return new ParsingError(node, L"A3: Observe expression should appear in a bind expression."); } Ptr WfErrors::ObserveInObserveEvent(WfExpression* node) { return new ParsingError(node, L"A4: Observe expression should not appear in the event expression in another observe expression."); } Ptr WfErrors::BindInBind(WfExpression* node) { return new ParsingError(node, L"A4: Bind expression should not appear in another bind expression."); } Ptr WfErrors::AttachInBind(WfExpression* node) { return new ParsingError(node, L"A4: Attach expression should not appear in another bind expression."); } Ptr WfErrors::DetachInBind(WfExpression* node) { return new ParsingError(node, L"A4: Detach expression should not appear in another bind expression."); } Ptr WfErrors::ConstructorMixMapAndList(WfExpression* node) { return new ParsingError(node, L"A5: Key-value pairs are not allowed in list constructor expression."); } Ptr WfErrors::ConstructorMixStructAndList(WfExpression* node) { return new ParsingError(node, L"A5: Field-value pairs are expected in struct constructor expression."); } Ptr WfErrors::DuplicatedConstructorField(WfReferenceExpression* node) { return new ParsingError(node, L"A5: The same field cannot be assigned more than once in struct constructor expression."); } Ptr WfErrors::ConstructorMixClassAndInterface(WfNewClassExpression* node) { return new ParsingError(node, L"A6: Arguments are not allowed in new interface expression."); } Ptr WfErrors::ConstructorMixClassAndInterface(WfNewInterfaceExpression* node) { return new ParsingError(node, L"A6: Members are not allowed in new class expression."); } Ptr WfErrors::ScopeNameIsNotExpression(WfExpression* node, Ptr scopeName) { return new ParsingError(node, L"A7: Symbol \"" + scopeName->GetFriendlyName() + L"\" cannot be used as an expression."); } Ptr 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 WfErrors::ExpressionIsNotScopeName(WfExpression* node) { return new ParsingError(node, L"A8: Expression does not reference to a declaration."); } Ptr WfErrors::ExpressionIsNotEvent(WfExpression* node) { return new ParsingError(node, L"A8: Expression does not reference to an event."); } Ptr WfErrors::ExpressionCannotResolveType(WfExpression* node, Ptr symbol) { return new ParsingError(node, L"A9: Expression referencing to symbol \"" + symbol->name + L"\" failed to resolve its type."); } Ptr WfErrors::NullCannotResolveType(WfExpression* node) { return new ParsingError(node, L"A9: Expression \"null\" failed to resolve its type."); } Ptr WfErrors::ConstructorCannotResolveType(WfExpression* node) { return new ParsingError(node, L"A9: Expression \"{}\" failed to resolve its type."); } Ptr WfErrors::OrderedLambdaCannotResolveType(WfExpression* node) { return new ParsingError(node, L"A9: Ordered lambda expression failed to resolve its type."); } Ptr WfErrors::NullCannotImplicitlyConvertToType(WfExpression* node, reflection::description::ITypeInfo* toType) { return new ParsingError(node, L"A10: Expression \"null\" cannot implicitly convert to \"" + toType->GetTypeFriendlyName() + L"\"."); } Ptr WfErrors::ConstructorCannotImplicitlyConvertToType(WfExpression* node, reflection::description::ITypeInfo* toType) { return new ParsingError(node, L"A10: Expression \"{}\" cannot implicitly convert to \"" + toType->GetTypeFriendlyName() + L"\"."); } Ptr 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 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 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 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 WfErrors::IntegerLiteralOutOfRange(WfIntegerExpression* node) { return new ParsingError(node, L"A13: Integer literal \"" + node->value.value + L"\" out of range."); } Ptr WfErrors::FloatingLiteralOutOfRange(WfFloatingExpression* node) { return new ParsingError(node, L"A13: Floating literal \"" + node->value.value + L"\" out of range."); } Ptr 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 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 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 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 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 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 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 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 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 WfErrors::CannotPickOverloadedFunctions(parsing::ParsingTreeCustomBase* node, collections::List& 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 WfErrors::ClassContainsNoConstructor(WfExpression* node, reflection::description::ITypeInfo* type) { return new ParsingError(node, L"A23: Class \"" + type->GetTypeFriendlyName() + L"\" does not contain any constructor."); } Ptr WfErrors::InterfaceContainsNoConstructor(WfExpression* node, reflection::description::ITypeInfo* type) { Ptr proxy = TypeInfoRetriver>::CreateTypeInfo(); return new ParsingError(node, L"A23: Interface \"" + type->GetTypeFriendlyName() + L"\" does not contain any constructor receiving an \"" + proxy->GetTypeFriendlyName() + L"\"."); } Ptr 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 WfErrors::ExpressionIsNotLeftValue(WfExpression* node, const ResolveExpressionResult& result) { return new ParsingError(node, L"A25: " + result.GetFriendlyName(true) + L" is not assignable."); } Ptr 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 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 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 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 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 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 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 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 WfErrors::ExpectedTypeCastCannotResolveType(WfExpression* node) { return new ParsingError(node, L"A33: Cannot resolve type \"*\". This expression should only appear on a place which has an explicit type, including variables and arguments."); } Ptr WfErrors::WrongVoidType(WfType* node) { return new ParsingError(node, L"B0: Void is not a type for a value."); } Ptr WfErrors::WrongInterfaceType(WfType* node) { return new ParsingError(node, L"B1: Interface is not a type for a value."); } Ptr 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 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 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 WfErrors::ChildOfNonReferenceType(WfType* node) { return new ParsingError(node, L"B5: Only a reference type have child types."); } Ptr WfErrors::TypeNotExists(WfType* node, Ptr scopeName) { return new ParsingError(node, L"B6: \"" + scopeName->GetFriendlyName() + L"\" is not a type."); } Ptr WfErrors::TypeNotExists(WfType* node, const ResolveExpressionResult& result) { return new ParsingError(node, L"B6: \"" + result.GetFriendlyName() + L"\" is not a type."); } Ptr 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 WfErrors::BreakNotInLoop(WfStatement* node) { return new ParsingError(node, L"C0: Break statement should appear in a loop."); } Ptr WfErrors::ContinueNotInLoop(WfStatement* node) { return new ParsingError(node, L"C1: Continue statement should appear in a loop."); } Ptr WfErrors::RethrowNotInCatch(WfStatement* node) { return new ParsingError(node, L"C2: Re-raise exception statement should appear in catch."); } Ptr WfErrors::TryMissCatchAndFinally(WfStatement* node) { return new ParsingError(node, L"C3: Try statement should not appear without both catch and finally."); } Ptr 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 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 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 WfErrors::WrongCoPause(WfStatement* node) { return new ParsingError(node, L"C7: $pause statement should appear inside a $coroutine expression, and it cannot be nested."); } Ptr 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 WfErrors::WrongCoOperator(WfExpression* node) { return new ParsingError(node, L"C8: $.Operator expression should appear inside a coroutine function (which has a functiona body like ${} or $Provider{})."); } Ptr WfErrors::CoProviderNotExists(WfCoProviderStatement* node, collections::List& 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 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 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 WfErrors::CoOperatorNotExists(WfCoOperatorExpression* node, reflection::description::ITypeInfo* type) { return new ParsingError(node, L"C10: Static function \"QueryContext\" does not exist in coroutine provider \"" + type->GetTypeFriendlyName() + L"\"."); } Ptr WfErrors::CoOperatorCannotResolveResultType(WfCoOperatorStatement* node, collections::List& 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 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 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 WfErrors::GotoLabelNotExists(WfGotoStatement* node) { return new ParsingError(node, L"C13: Goto label \"" + node->label.value + L"\" does not exists. A goto label can only jump to the end of any block statement that contains this goto statement in the current function."); } Ptr WfErrors::TooManyGotoLabel(WfGotoStatement* node) { return new ParsingError(node, L"C14: Too many goto targets \"" + node->label.value + L"\" found."); } Ptr WfErrors::WrongStateSwitchStatement(WfStateSwitchStatement* node) { return new ParsingError(node, L"C15: $switch statement should appear inside a $state declaration."); } Ptr WfErrors::WrongStateInvokeStatement(WfStateInvokeStatement* node) { return new ParsingError(node, L"C16: $goto_state or $push_state statement should appear inside a $state declaration."); } Ptr WfErrors::StateInputNotExists(WfStateSwitchCase* node) { return new ParsingError(node, L"C17: State input \"" + node->name.value + L"\" does not exist."); } Ptr WfErrors::StateSwitchArgumentCountNotMatch(WfStateSwitchCase* node) { return new ParsingError(node, L"C18: The number of arguments doesn not match the declaration of state input \"" + node->name.value + L"\"."); } Ptr WfErrors::StateNotExists(WfStateInvokeStatement* node) { return new ParsingError(node, L"C19: State \"" + node->name.value + L"\" does not exist."); } Ptr WfErrors::StateArgumentCountNotMatch(WfStateInvokeStatement* node) { return new ParsingError(node, L"C20: The number of arguments doesn not match the declaration of state \"" + node->name.value + L"\"."); } Ptr WfErrors::FunctionShouldHaveName(WfDeclaration* node) { return new ParsingError(node, L"D0: Function should have a name."); } Ptr WfErrors::FunctionShouldHaveImplementation(WfDeclaration* node) { return new ParsingError(node, L"D0: Function should be implemented."); } Ptr WfErrors::InterfaceMethodShouldNotHaveImplementation(WfDeclaration* node) { return new ParsingError(node, L"D0: Interface method should not be implemented."); } Ptr 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 WfErrors::DuplicatedDeclaration(WfStateMachineDeclaration* node) { return new ParsingError(node, L"D1: Duplicated $state_machine declaration."); } Ptr WfErrors::DuplicatedSymbol(WfDeclaration* node, Ptr symbol) { return new ParsingError(node, L"D2: Duplicated symbol \"" + symbol->name + L"\"."); } Ptr WfErrors::DuplicatedSymbol(WfFunctionArgument* node, Ptr symbol) { return new ParsingError(node, L"D2: Duplicated symbol \"" + symbol->name + L"\"."); } Ptr WfErrors::DuplicatedSymbol(WfStatement* node, Ptr symbol) { return new ParsingError(node, L"D2: Duplicated symbol \"" + symbol->name + L"\"."); } Ptr WfErrors::DuplicatedSymbol(WfExpression* node, Ptr symbol) { return new ParsingError(node, L"D2: Duplicated symbol \"" + symbol->name + L"\"."); } Ptr WfErrors::DuplicatedSymbol(WfStateInput* node, Ptr symbol) { return new ParsingError(node, L"D2: Duplicated symbol \"" + symbol->name + L"\"."); } Ptr WfErrors::DuplicatedSymbol(WfStateDeclaration* node, Ptr symbol) { return new ParsingError(node, L"D2: Duplicated symbol \"" + symbol->name + L"\"."); } Ptr WfErrors::DuplicatedSymbol(WfStateSwitchArgument* node, Ptr symbol) { return new ParsingError(node, L"D2: Duplicated symbol \"" + symbol->name + L"\"."); } Ptr 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 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 WfErrors::CannotPickOverloadedInterfaceMethods(WfExpression* node, collections::List& results) { WString description; FOREACH(ResolveExpressionResult, result, 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 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 WfErrors::WrongDeclaration(WfEventDeclaration* node) { return new ParsingError(node, L"D7: Event \"" + node->name.value + L"\" cannot be defined outside of classes or interfaces."); } Ptr WfErrors::WrongDeclaration(WfPropertyDeclaration* node) { return new ParsingError(node, L"D7: Property \"" + node->name.value + L"\" cannot be defined outside of classes or interfaces."); } Ptr WfErrors::WrongDeclaration(WfConstructorDeclaration* node) { return new ParsingError(node, L"D7: Constructor cannot be defined outside of classes."); } Ptr WfErrors::WrongDeclaration(WfDestructorDeclaration* node) { return new ParsingError(node, L"D7: Destructor cannot be defined outside of classes."); } Ptr WfErrors::WrongDeclaration(WfAutoPropertyDeclaration* node) { return new ParsingError(node, L"D7: Auto-property cannot be defined outside of classes."); } Ptr WfErrors::WrongDeclaration(WfStateMachineDeclaration* node) { return new ParsingError(node, L"D7: State machine cannot be defined outside of classes."); } Ptr 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 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 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 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 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 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 WfErrors::StructRecursivelyIncludeItself(WfStructDeclaration* node, collections::List& tds) { WString description; FOREACH(ITypeDescriptor*, td, tds) { description += L"\r\n\t"; description += td->GetTypeName(); } return new ParsingError(node, L"D13: Recursive references are found in these struct definitions:" + description + L"."); } Ptr 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 WfErrors::AttributeNotExists(WfAttribute* node) { return new ParsingError(node, L"D15: Attribute \"" + node->category.value + L":" + node->name.value + L"\" does not exist."); } Ptr WfErrors::AttributeMissValue(WfAttribute* node) { return new ParsingError(node, L"D15: Value of attribute \"" + node->category.value + L":" + node->name.value + L"\" is missing."); } Ptr WfErrors::StateMachineClassNotInheritFromStateMachine(WfClassDeclaration* node) { return new ParsingError(node, L"D16: State machine class \"" + node->name.value + L"\" should inherit from \"system::StateMachine\" directly."); } Ptr WfErrors::MissingDefaultState(WfStateMachineDeclaration* node) { return new ParsingError(node, L"D17: Missing default state."); } Ptr 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 WfErrors::TopQualifiedSymbolNotExists(parsing::ParsingTreeCustomBase* node, const WString& name) { return new ParsingError(node, L"F0: Top qualified symbol \"" + name + L"\" does not exist."); } Ptr WfErrors::ChildSymbolNotExists(parsing::ParsingTreeCustomBase* node, Ptr scopeName, const WString& name) { return new ParsingError(node, L"F1: Symbol \"" + name + L"\" does not exist in \"" + scopeName->GetFriendlyName() + L"\"."); } Ptr 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 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 WfErrors::TooManyTargets(parsing::ParsingTreeCustomBase* node, collections::List& 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 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 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 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 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 WfErrors::AutoPropertyCannotBeStatic(WfDeclaration* node) { return new ParsingError(node, L"G1: Auto property \"" + node->name.value + L"\" cannot be static ."); } Ptr WfErrors::WrongClassMember(WfNamespaceDeclaration* node) { return new ParsingError(node, L"G2: Namespace \"" + node->name.value + L"\" cannot be a class member."); } Ptr 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 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 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 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 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 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 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 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 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 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 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 WfErrors::WrongInterfaceBaseType(WfClassDeclaration* node, reflection::description::ITypeDescriptor* type) { Ptr proxy = TypeInfoRetriver>::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 WfErrors::ClassWithInterfaceConstructor(WfClassDeclaration* node) { return new ParsingError(node, L"G7: Cannot use interface constructor type on class \"" + node->name.value + L"\"."); } Ptr 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 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 WfErrors::MissingFieldType(WfVariableDeclaration* node) { return new ParsingError(node, L"G9: Type of field \"" + node->name.value + L"\" is missing."); } Ptr 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 WfErrors::ClassRecursiveInheritance(WfClassDeclaration* node, collections::List& tds) { WString description; FOREACH(ITypeDescriptor*, td, tds) { description += L"\r\n\t"; description += td->GetTypeName(); } return new ParsingError(node, L"G10: Recursive inheriting are found in these class definitions:" + description + L"."); } Ptr WfErrors::InterfaceRecursiveInheritance(WfClassDeclaration* node, collections::List& tds) { WString description; FOREACH(ITypeDescriptor*, td, tds) { description += L"\r\n\t"; description += td->GetTypeName(); } return new ParsingError(node, L"G10: Recursive inheriting are found in these interface definitions:" + description + L"."); } Ptr 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 WfErrors::DuplicatedBaseConstructorCall(WfBaseConstructorCall* node, reflection::description::ITypeDescriptor* type) { return new ParsingError(node, L"G12: Base type \"" + type->GetTypeName() + L"\" has already been initialized."); } Ptr WfErrors::TooManyDestructor(WfDestructorDeclaration* node, WfClassDeclaration* classDecl) { return new ParsingError(node, L"G13: Class \"" + classDecl->name.value + L"\" has too many destructors."); } Ptr WfErrors::AutoPropertyShouldBeInitialized(WfAutoPropertyDeclaration* node) { return new ParsingError(node, L"G13: Auto property \"" + node->name.value + L"\" should be initialized."); } Ptr 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"\"."); } Ptr WfErrors::CppUnableToDecideClassOrder(WfClassDeclaration* node, collections::List& tds) { WString description; FOREACH(ITypeDescriptor*, td, tds) { description += L"\r\n\t"; description += td->GetTypeName(); } return new ParsingError(node, L"CPP1: (C++ Code Generation) Cannot decide order of the following classes. It is probably caused by inheritance relationships of internal classes inside these classes:" + description + L"."); } Ptr WfErrors::CppUnableToSeparateCustomFile(WfClassDeclaration* node, collections::List& tds) { WString description; FOREACH(ITypeDescriptor*, td, tds) { description += L"\r\n\t"; description += td->GetTypeName(); } return new ParsingError(node, L"CPP2: (C++ Code Generation) @cpp:File atrribute values for these classes are invalid. Generating classes to source files specified by these attribute values will create source files which do not compile. It is probably caused by inheritance relationships of internal classes inside these classes:" + description + L"."); } } } } /*********************************************************************** .\ANALYZER\WFANALYZER_EXPANDBINDEXPRESSION.CPP ***********************************************************************/ namespace vl { namespace workflow { namespace analyzer { using namespace collections; using namespace reflection; using namespace reflection::description; using namespace parsing; using namespace stream; /*********************************************************************** SearchUntilNonVirtualStatement ***********************************************************************/ class SearchUntilNonVirtualStatementVisitor : public empty_visitor::StatementVisitor { public: Ptr result; SearchUntilNonVirtualStatementVisitor(Ptr _result) :result(_result) { } void Dispatch(WfVirtualCseStatement* node)override { result = node->expandedStatement; result->Accept(this); } void Dispatch(WfCoroutineStatement* node)override { } void Dispatch(WfStateMachineStatement* node)override { } }; Ptr SearchUntilNonVirtualStatement(Ptr statement) { SearchUntilNonVirtualStatementVisitor visitor(statement); statement->Accept(&visitor); return visitor.result; } /*********************************************************************** Copy(Type|Expression|Statement|Declaration) ***********************************************************************/ class CopyDeclarationWithExpandVirtualVisitor : empty_visitor::DeclarationVisitor { public: bool expanded = false; List>& decls; CopyDeclarationWithExpandVirtualVisitor(List>& _decls) :decls(_decls) { } void Dispatch(WfVirtualCfeDeclaration* node)override { expanded = true; FOREACH(Ptr, decl, node->expandedDeclarations) { Execute(decls, decl); } } void Dispatch(WfVirtualCseDeclaration* node)override { expanded = true; FOREACH(Ptr, decl, node->expandedDeclarations) { Execute(decls, decl); } } static void Execute(List>& decls, Ptr decl) { CopyDeclarationWithExpandVirtualVisitor visitor(decls); decl->Accept(&visitor); if (!visitor.expanded) { decls.Add(decl); } } }; void CopyWithExpandVirtualVisitor::Expand(collections::List>& decls) { if (expandVirtualAst) { List> copied; CopyFrom(copied, decls); decls.Clear(); FOREACH(Ptr, decl, copied) { CopyDeclarationWithExpandVirtualVisitor::Execute(decls, decl); } } } CopyWithExpandVirtualVisitor::CopyWithExpandVirtualVisitor(bool _expandVirtualAst) :expandVirtualAst(_expandVirtualAst) { } Ptr CopyWithExpandVirtualVisitor::Dispatch(WfVirtualCfeExpression* node) { if (!expandVirtualAst || !node->expandedExpression) { return copy_visitor::ModuleVisitor::Dispatch(node); } node->expandedExpression->Accept(this); return result; } Ptr CopyWithExpandVirtualVisitor::Dispatch(WfVirtualCseExpression* node) { if (!expandVirtualAst || !node->expandedExpression) { return copy_visitor::ModuleVisitor::Dispatch(node); } node->expandedExpression->Accept(this); return result; } Ptr CopyWithExpandVirtualVisitor::Dispatch(WfVirtualCseStatement* node) { if (!expandVirtualAst || !node->expandedStatement) { return copy_visitor::ModuleVisitor::Dispatch(node); } node->expandedStatement->Accept(this); return result; } void CopyWithExpandVirtualVisitor::Visit(WfNamespaceDeclaration* node) { copy_visitor::DeclarationVisitor::Visit(node); Expand(result.Cast()->declarations); } void CopyWithExpandVirtualVisitor::Visit(WfClassDeclaration* node) { copy_visitor::DeclarationVisitor::Visit(node); Expand(result.Cast()->declarations); } void CopyWithExpandVirtualVisitor::Visit(WfNewInterfaceExpression* node) { copy_visitor::ExpressionVisitor::Visit(node); Expand(result.Cast()->declarations); } Ptr CopyType(Ptr type) { return CopyWithExpandVirtualVisitor(false).CreateField(type); } Ptr CopyExpression(Ptr expression, bool expandVirtualExprStat) { return CopyWithExpandVirtualVisitor(expandVirtualExprStat).CreateField(expression); } Ptr CopyStatement(Ptr statement, bool expandVirtualExprStat) { return CopyWithExpandVirtualVisitor(expandVirtualExprStat).CreateField(statement); } Ptr CopyDeclaration(Ptr declaration, bool expandVirtualExprStat) { return CopyWithExpandVirtualVisitor(expandVirtualExprStat).CreateField(declaration); } Ptr CopyModule(Ptr module, bool expandVirtualExprStat) { return CopyWithExpandVirtualVisitor(expandVirtualExprStat).CreateField(module); } /*********************************************************************** observing expressions: WfObserveExpression WfMemberExpression that detects the event ***********************************************************************/ class BindContext : public Object { typedef collections::List ExprList; typedef collections::Dictionary ExprMap; typedef collections::Group ExprGroup; typedef collections::Group ExprEventGroup; public: ExprMap observeParents; ExprEventGroup observeEvents; ExprList orderedObserves; ExprList cachedExprs; // expression that need to cache its value ExprMap renames; // expression -> the expression being renamed ExprGroup exprAffects; // observe expression -> all expressions that it can cause to change ExprGroup exprCauses; // expression -> observe expressions that cause it to change ExprGroup observeAffects; // observe expression -> all observe expressions that it can cause to change ExprGroup observeCauses; // observe expression -> observe expressions that cause it to change WString GetCacheVariableName(vint index) { return L"" + itow(index); } vint GetCachedExpressionIndex(WfExpression* expression, bool ensureExists) { vint index = cachedExprs.IndexOf(expression); if (ensureExists) { CHECK_ERROR(index != -1, L"BindContext::GetCachedExpressionIndex(WfExpression*, bool)#Cached expression not exists."); } return index; } vint GetCachedExpressionIndexRecursively(WfExpression* expression, bool ensureExists) { WfExpression* cache = expression; while (true) { vint index = renames.Keys().IndexOf(cache); if (index == -1) { return GetCachedExpressionIndex(cache, ensureExists); } else { cache = renames.Values()[index]; } } } }; struct CallbackInfo { WfExpression* observe; IEventInfo* eventInfo; vint eventIndex; WString handlerName; WString callbackName; }; struct BindCallbackInfo { Dictionary> handlerVariables; Dictionary> callbackFunctions; Group observeCallbackInfos; }; /*********************************************************************** CreateBindContext ***********************************************************************/ class CreateBindContextVisitor : public Object, public WfExpression::IVisitor { public: WfLexicalScopeManager* manager; BindContext& context; CreateBindContextVisitor(WfLexicalScopeManager* _manager, BindContext& _context) :manager(_manager) , context(_context) { } void Call(WfExpression* node) { node->Accept(this); } void ObservableDepend(WfExpression* expr, WfExpression* parent) { if (context.observeParents.Keys().Contains(expr)) { CHECK_ERROR(context.observeParents[expr] == parent, L"CreateBindContextVisitor::ObservableDepend assigned different parents to the same expression."); return; } context.orderedObserves.Add(expr); context.observeParents.Add(expr, parent); DirectDepend(expr, parent, false); { auto cache = parent; while (true) { vint index = context.renames.Keys().IndexOf(cache); if (index == -1) { index = context.cachedExprs.IndexOf(cache); if (index == -1) { context.cachedExprs.Add(cache); } break; } else { cache = context.renames.Values()[index]; } } } vint index = context.exprCauses.Keys().IndexOf(parent); if (index != -1) { FOREACH(WfExpression*, observe, context.exprCauses.GetByIndex(index)) { context.observeAffects.Add(observe, expr); context.observeCauses.Add(expr, observe); } } context.exprAffects.Add(expr, expr); context.exprCauses.Add(expr, expr); } void DirectDepend(WfExpression* expr, WfExpression* depended, bool processDepended = true) { if (processDepended) { Call(depended); } vint index = context.exprCauses.Keys().IndexOf(depended); if (index != -1) { FOREACH(WfExpression*, observe, context.exprCauses.GetByIndex(index)) { context.exprCauses.Add(expr, observe); context.exprAffects.Add(observe, expr); } } } void Visit(WfThisExpression* node)override { // root expression, nothing to do } void Visit(WfTopQualifiedExpression* node)override { // root expression, nothing to do } void Visit(WfReferenceExpression* node)override { auto result = manager->expressionResolvings[node]; if (result.symbol) { auto scope = result.symbol->ownerScope; if (auto letExpr = dynamic_cast(scope->ownerNode.Obj())) { auto letVar = From(letExpr->variables) .Where([=](const Ptr& letVar) { return letVar->name.value == node->name.value; }) .First(); context.renames.Add(node, letVar->value.Obj()); DirectDepend(node, letVar->value.Obj(), false); } else if (auto observeExpr = dynamic_cast(scope->ownerNode.Obj())) { context.renames.Add(node, observeExpr->parent.Obj()); DirectDepend(node, observeExpr->parent.Obj()); } } } void Visit(WfOrderedNameExpression* node)override { // root expression, nothing to do } void Visit(WfOrderedLambdaExpression* node)override { // root expression, nothing to do } void Visit(WfMemberExpression* node)override { Call(node->parent.Obj()); auto scope = manager->nodeScopes[node].Obj(); while (scope) { if (scope->ownerNode.Cast()) { break; } scope = scope->parentScope.Obj(); } if (!scope) { 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) { ObservableDepend(node, node->parent.Obj()); context.observeEvents.Add(node, ev); return; } } } DirectDepend(node, node->parent.Obj(), false); } void Visit(WfChildExpression* node)override { DirectDepend(node, node->parent.Obj()); } void Visit(WfLiteralExpression* node)override { // root expression, nothing to do } void Visit(WfFloatingExpression* node)override { // root expression, nothing to do } void Visit(WfIntegerExpression* node)override { // root expression, nothing to do } void Visit(WfStringExpression* node)override { // root expression, nothing to do } void Visit(WfUnaryExpression* node)override { DirectDepend(node, node->operand.Obj()); } void Visit(WfBinaryExpression* node)override { DirectDepend(node, node->first.Obj()); DirectDepend(node, node->second.Obj()); } void Visit(WfLetExpression* node)override { FOREACH(Ptr, var, node->variables) { DirectDepend(node, var->value.Obj()); } DirectDepend(node, node->expression.Obj()); } void Visit(WfIfExpression* node)override { DirectDepend(node, node->condition.Obj()); DirectDepend(node, node->trueBranch.Obj()); DirectDepend(node, node->falseBranch.Obj()); } void Visit(WfRangeExpression* node)override { DirectDepend(node, node->begin.Obj()); DirectDepend(node, node->end.Obj()); } void Visit(WfSetTestingExpression* node)override { DirectDepend(node, node->collection.Obj()); DirectDepend(node, node->element.Obj()); } void Visit(WfConstructorExpression* node)override { auto result = manager->expressionResolvings[node]; bool isStruct = (result.type->GetTypeDescriptor()->GetTypeDescriptorFlags() == TypeDescriptorFlags::Struct); FOREACH(Ptr, argument, node->arguments) { if (!isStruct) { DirectDepend(node, argument->key.Obj()); } DirectDepend(node, argument->value.Obj()); } } void Visit(WfInferExpression* node)override { DirectDepend(node, node->expression.Obj()); } void Visit(WfTypeCastingExpression* node)override { DirectDepend(node, node->expression.Obj()); } void Visit(WfTypeTestingExpression* node)override { DirectDepend(node, node->expression.Obj()); } void Visit(WfTypeOfTypeExpression* node)override { // root expression, nothing to do } void Visit(WfTypeOfExpressionExpression* node)override { // root expression, nothing to do } void Visit(WfAttachEventExpression* node)override { DirectDepend(node, node->event.Obj()); DirectDepend(node, node->function.Obj()); } void Visit(WfDetachEventExpression* node)override { DirectDepend(node, node->event.Obj()); DirectDepend(node, node->handler.Obj()); } void Visit(WfObserveExpression* node)override { Call(node->parent.Obj()); ObservableDepend(node, node->parent.Obj()); Call(node->expression.Obj()); FOREACH(Ptr, eventExpr, node->events) { auto result = manager->expressionResolvings[eventExpr.Obj()]; context.observeEvents.Add(node, result.eventInfo); Call(eventExpr.Obj()); } } void Visit(WfCallExpression* node)override { DirectDepend(node, node->function.Obj()); FOREACH(Ptr, argument, node->arguments) { DirectDepend(node, argument.Obj()); } } void Visit(WfFunctionExpression* node)override { // root expression, nothing to do } void Visit(WfNewClassExpression* node)override { FOREACH(Ptr, argument, node->arguments) { DirectDepend(node, argument.Obj()); } } void Visit(WfNewInterfaceExpression* node)override { // root expression, nothing to do } void Visit(WfVirtualCfeExpression* node)override { DirectDepend(node, node->expandedExpression.Obj()); } void Visit(WfVirtualCseExpression* node)override { DirectDepend(node, node->expandedExpression.Obj()); } }; /*********************************************************************** ExpandObserveExpression ***********************************************************************/ Ptr CreateReference(const WString& name) { auto ref = MakePtr(); ref->name.value = name; return ref; } class ExpandObserveExpressionVisitor : public CopyWithExpandVirtualVisitor { public: BindContext& context; ExpandObserveExpressionVisitor(BindContext& _context) :CopyWithExpandVirtualVisitor(true) , context(_context) { } vl::Ptr CreateField(vl::Ptr from)override { return Execute(from.Obj(), context); } static Ptr Execute(WfExpression* expression, BindContext& context, bool expandImmediately = true) { if (!expression) { return nullptr; } { vint index = context.GetCachedExpressionIndexRecursively(expression, false); if (index != -1) { if (expandImmediately) { return CreateReference(context.GetCacheVariableName(index)); } else { expression = context.cachedExprs[index]; } } } ExpandObserveExpressionVisitor visitor(context); expression->Accept(&visitor); return visitor.result.Cast(); } void Visit(WfLetExpression* node)override { auto letExpr = MakePtr(); FOREACH(Ptr, var, node->variables) { if (context.GetCachedExpressionIndexRecursively(var->value.Obj(), false) == -1) { auto letVar = MakePtr(); letVar->name.value = var->name.value; letVar->value = Execute(var->value.Obj(), context); letExpr->variables.Add(letVar); } } if (letExpr->variables.Count() == 0) { result = Execute(node->expression.Obj(), context); } else { letExpr->expression = Execute(node->expression.Obj(), context); result = letExpr; } } void Visit(WfObserveExpression* node)override { if (node->observeType == WfObserveType::SimpleObserve) { auto expr = MakePtr(); expr->parent = CreateField(node->parent); expr->name.value = node->expression.Cast()->name.value; result = expr; } else { result = CreateField(node->expression); } } }; /*********************************************************************** CreateDefaultValue ***********************************************************************/ Ptr CreateDefaultValue(ITypeInfo* elementType) { auto valueType = elementType->GetTypeDescriptor()->GetValueType(); if (elementType->GetDecorator()==ITypeInfo::TypeDescriptor && valueType != nullptr) { switch (GetTypeFlag(elementType)) { case TypeFlag::Enum: { auto intExpr = MakePtr(); intExpr->value.value = L"0"; auto inferExpr = MakePtr(); inferExpr->strategy = WfTypeCastingStrategy::Strong; inferExpr->expression = intExpr; inferExpr->type = GetTypeFromTypeInfo(CreateTypeInfoFromTypeFlag(TypeFlag::U8).Obj()); auto castExpr = MakePtr(); castExpr->strategy = WfTypeCastingStrategy::Strong; castExpr->expression = inferExpr; castExpr->type = GetTypeFromTypeInfo(elementType); return castExpr; } case TypeFlag::String: { auto stringExpr = MakePtr(); return stringExpr; } break; case TypeFlag::Struct: if (elementType->GetTypeDescriptor()->GetSerializableType() == nullptr) { auto ctorExpr = MakePtr(); auto castExpr = MakePtr(); castExpr->strategy = WfTypeCastingStrategy::Strong; castExpr->expression = ctorExpr; castExpr->type = GetTypeFromTypeInfo(elementType); return castExpr; } default: { auto td = elementType->GetTypeDescriptor(); if (td == description::GetTypeDescriptor()) { auto expr = MakePtr(); expr->value = WfLiteralValue::False; return expr; } if (td == description::GetTypeDescriptor()) { auto expr = MakePtr(); return expr; } else if (td == description::GetTypeDescriptor() || td == description::GetTypeDescriptor()) { auto valueExpr = MakePtr(); valueExpr->value.value = L"0"; auto inferExpr = MakePtr(); inferExpr->expression = valueExpr; inferExpr->type = GetTypeFromTypeInfo(elementType); return inferExpr; } else if (td == description::GetTypeDescriptor() || td == description::GetTypeDescriptor() || td == description::GetTypeDescriptor() || td == description::GetTypeDescriptor() || td == description::GetTypeDescriptor() || td == description::GetTypeDescriptor() || td == description::GetTypeDescriptor() || td == description::GetTypeDescriptor()) { auto valueExpr = MakePtr(); valueExpr->value.value = L"0"; auto inferExpr = MakePtr(); inferExpr->expression = valueExpr; inferExpr->type = GetTypeFromTypeInfo(elementType); return inferExpr; } else { // Consider adding a \"default (type)\" expression if CreateDefault() cannot be liminated from the compiler. CHECK_FAIL(L"All serializable types should have been handled!"); /* auto stringExpr = MakePtr(); elementType->GetTypeDescriptor()->GetSerializableType()->Serialize(valueType->CreateDefault(), stringExpr->value.value); auto castExpr = MakePtr(); castExpr->strategy = WfTypeCastingStrategy::Strong; castExpr->expression = stringExpr; castExpr->type = GetTypeFromTypeInfo(elementType); return castExpr; */ } } } } else { auto nullExpr = MakePtr(); nullExpr->value = WfLiteralValue::Null; auto inferExpr = MakePtr(); inferExpr->expression = nullExpr; inferExpr->type = GetTypeFromTypeInfo(elementType); return inferExpr; } } /*********************************************************************** CreateBindWritableVariable ***********************************************************************/ Ptr CreateWritableVariable(const WString& name, ITypeInfo* type, Ptr value = nullptr) { auto decl = MakePtr(); decl->name.value = name; decl->type = GetTypeFromTypeInfo(type); decl->expression = value ? value : CreateDefaultValue(type); return decl; } Ptr CreateWritableVariableStatement(const WString& name, ITypeInfo* type, Ptr value = nullptr) { auto stat = MakePtr(); stat->variable = CreateWritableVariable(name, type, value); return stat; } /*********************************************************************** IValueSubscription::Subscribe ***********************************************************************/ Ptr AssignNormalMember(Ptr decl) { decl->classMember = MakePtr(); decl->classMember->kind = WfClassMemberKind::Normal; return decl; } Ptr AssignOverrideMember(Ptr decl) { decl->classMember = MakePtr(); decl->classMember->kind = WfClassMemberKind::Override; return decl; } /*********************************************************************** ExpandObserveEvent ***********************************************************************/ Ptr ExpandObserveEvent(WfLexicalScopeManager* manager, WfExpression* observe, vint eventIndex, BindContext& context) { auto cacheName = context.GetCacheVariableName(context.GetCachedExpressionIndexRecursively(context.observeParents[observe], true)); if (auto observeExpr = dynamic_cast(observe)) { if (observeExpr->observeType == WfObserveType::SimpleObserve) { auto expr = MakePtr(); expr->parent = CreateReference(cacheName); expr->name.value = observeExpr->events[eventIndex].Cast()->name.value; return expr; } else { return ExpandObserveExpressionVisitor::Execute(observeExpr->events[eventIndex].Obj(), context); } } else { auto eventName = context.observeEvents[observe][0]->GetName(); auto expr = MakePtr(); expr->parent = CreateReference(cacheName); expr->name.value = eventName; return expr; } } /*********************************************************************** CreateBindAttachStatement ***********************************************************************/ void CreateBindAttachStatement(Ptr block, WfLexicalScopeManager* manager, WfExpression* observe, BindContext& context, BindCallbackInfo& info) { FOREACH(CallbackInfo, callbackInfo, info.observeCallbackInfos[observe]) { auto attach = MakePtr(); attach->event = ExpandObserveEvent(manager, observe, callbackInfo.eventIndex, context); attach->function = CreateReference(callbackInfo.callbackName); auto nullExpr = MakePtr(); nullExpr->value = WfLiteralValue::Null; auto protect = MakePtr(); protect->first = attach; protect->second = nullExpr; protect->op = WfBinaryOperator::FailedThen; auto assign = MakePtr(); assign->op = WfBinaryOperator::Assign; assign->first = CreateReference(callbackInfo.handlerName); assign->second = protect; auto stat = MakePtr(); stat->expression = assign; block->statements.Add(stat); } } /*********************************************************************** CreateBindDetachStatement ***********************************************************************/ void CreateBindDetachStatement(Ptr block, WfLexicalScopeManager* manager, WfExpression* observe, BindContext& context, BindCallbackInfo& info) { FOREACH(CallbackInfo, callbackInfo, info.observeCallbackInfos[observe]) { auto testNull = MakePtr(); testNull->expression = CreateReference(callbackInfo.handlerName); testNull->test = WfTypeTesting::IsNotNull; auto ifStat = MakePtr(); ifStat->expression = testNull; auto trueBlock = MakePtr(); ifStat->trueBranch = trueBlock; block->statements.Add(ifStat); { auto detach = MakePtr(); detach->event = ExpandObserveEvent(manager, observe, callbackInfo.eventIndex, context); detach->handler = CreateReference(callbackInfo.handlerName); auto stat = MakePtr(); stat->expression = detach; trueBlock->statements.Add(stat); } { auto nullExpr = MakePtr(); nullExpr->value = WfLiteralValue::Null; auto assignExpr = MakePtr(); assignExpr->first = CreateReference(callbackInfo.handlerName); assignExpr->second = nullExpr; assignExpr->op = WfBinaryOperator::Assign; auto stat = MakePtr(); stat->expression = assignExpr; trueBlock->statements.Add(stat); } } } /*********************************************************************** CreateBindCacheAssignStatement ***********************************************************************/ void CreateBindCacheAssignStatement(WfLexicalScopeManager* manager, Ptr block, WfExpression* observe, BindContext& context) { auto parent = context.observeParents[observe]; auto cacheName = context.GetCacheVariableName(context.GetCachedExpressionIndexRecursively(parent, true)); auto protect = MakePtr(); protect->first = ExpandObserveExpressionVisitor::Execute(parent, context, false); protect->second = CreateDefaultValue(manager->expressionResolvings[parent].type.Obj()); protect->op = WfBinaryOperator::FailedThen; auto assign = MakePtr(); assign->op = WfBinaryOperator::Assign; assign->first = CreateReference(cacheName); assign->second = protect; auto stat = MakePtr(); stat->expression = assign; block->statements.Add(stat); } /*********************************************************************** IValueSubscription::Open ***********************************************************************/ Ptr CreateBindOpenFunction(WfLexicalScopeManager* manager, BindContext& context, BindCallbackInfo& info) { auto func = MakePtr(); func->name.value = L"Open"; func->anonymity = WfFunctionAnonymity::Named; { auto typeInfo = TypeInfoRetriver::CreateTypeInfo(); func->returnType = GetTypeFromTypeInfo(typeInfo.Obj()); } auto block = MakePtr(); func->statement = block; { auto ifStat = MakePtr(); block->statements.Add(ifStat); { auto notExpr = MakePtr(); notExpr->op = WfUnaryOperator::Not; notExpr->operand = CreateReference(L""); ifStat->expression = notExpr; } auto ifBlock = MakePtr(); ifStat->trueBranch = ifBlock; { auto literal = MakePtr(); literal->value = WfLiteralValue::True; auto assign = MakePtr(); assign->op = WfBinaryOperator::Assign; assign->first = CreateReference(L""); assign->second = literal; auto stat = MakePtr(); stat->expression = assign; ifBlock->statements.Add(stat); } { SortedList assignedParents; SortedList observes; CopyFrom(observes, context.observeParents.Keys()); SortedList freeObserves; while (observes.Count() > 0) { CopyFrom( freeObserves, From(observes) .Where([&](WfExpression* observe) { return !context.observeCauses.Keys().Contains(observe) || From(context.observeCauses[observe]) .All([&](WfExpression* depended) { return !observes.Contains(depended); }); }) ); FOREACH(WfExpression*, observe, context.orderedObserves) { if (freeObserves.Contains(observe)) { auto parent = context.GetCachedExpressionIndexRecursively(context.observeParents[observe], true); if (!assignedParents.Contains(parent)) { assignedParents.Add(parent); CreateBindCacheAssignStatement(manager, ifBlock, observe, context); } } } FOREACH(WfExpression*, observe, freeObserves) { observes.Remove(observe); } freeObserves.Clear(); } } { FOREACH(WfExpression*, observe, context.orderedObserves) { CreateBindAttachStatement(ifBlock, manager, observe, context, info); } } { auto literal = MakePtr(); literal->value = WfLiteralValue::True; auto returnStat = MakePtr(); returnStat->expression = literal; ifBlock->statements.Add(returnStat); } } { auto literal = MakePtr(); literal->value = WfLiteralValue::False; auto returnStat = MakePtr(); returnStat->expression = literal; block->statements.Add(returnStat); } return func; } /*********************************************************************** IValueSubscription::Update ***********************************************************************/ Ptr CreateBindUpdateFunction(BindCallbackInfo& info) { auto func = MakePtr(); func->name.value = L"Update"; func->anonymity = WfFunctionAnonymity::Named; { auto typeInfo = TypeInfoRetriver::CreateTypeInfo(); func->returnType = GetTypeFromTypeInfo(typeInfo.Obj()); } auto block = MakePtr(); func->statement = block; { auto ifStat = MakePtr(); block->statements.Add(ifStat); { auto notExpr = MakePtr(); notExpr->op = WfUnaryOperator::Not; notExpr->operand = CreateReference(L""); auto andExpr = MakePtr(); andExpr->op = WfBinaryOperator::And; andExpr->first = CreateReference(L""); andExpr->second = notExpr; ifStat->expression = andExpr; } auto ifBlock = MakePtr(); ifStat->trueBranch = ifBlock; { auto ref = CreateReference(L""); auto call = MakePtr(); call->function = ref; auto stat = MakePtr(); stat->expression = call; ifBlock->statements.Add(stat); } { auto literal = MakePtr(); literal->value = WfLiteralValue::True; auto returnStat = MakePtr(); returnStat->expression = literal; ifBlock->statements.Add(returnStat); } } { auto literal = MakePtr(); literal->value = WfLiteralValue::False; auto returnStat = MakePtr(); returnStat->expression = literal; block->statements.Add(returnStat); } return func; } /*********************************************************************** IValueSubscription::Close ***********************************************************************/ Ptr CreateBindCloseFunction(WfLexicalScopeManager* manager, BindContext& context, BindCallbackInfo& info) { auto func = MakePtr(); func->name.value = L"Close"; func->anonymity = WfFunctionAnonymity::Named; { auto typeInfo = TypeInfoRetriver::CreateTypeInfo(); func->returnType = GetTypeFromTypeInfo(typeInfo.Obj()); } auto block = MakePtr(); func->statement = block; { auto ifStat = MakePtr(); block->statements.Add(ifStat); { auto notExpr = MakePtr(); notExpr->op = WfUnaryOperator::Not; notExpr->operand = CreateReference(L""); ifStat->expression = notExpr; } auto ifBlock = MakePtr(); ifStat->trueBranch = ifBlock; { auto literal = MakePtr(); literal->value = WfLiteralValue::True; auto assign = MakePtr(); assign->op = WfBinaryOperator::Assign; assign->first = CreateReference(L""); assign->second = literal; auto stat = MakePtr(); stat->expression = assign; ifBlock->statements.Add(stat); } FOREACH(WfExpression*, observe, context.orderedObserves) { CreateBindDetachStatement(ifBlock, manager, observe, context, info); } for (vint i = 0; i < context.cachedExprs.Count(); i++) { auto cacheName = context.GetCacheVariableName(i); auto type = manager->expressionResolvings[context.cachedExprs[i]].type; auto assign = MakePtr(); assign->op = WfBinaryOperator::Assign; assign->first = CreateReference(cacheName); assign->second = CreateDefaultValue(type.Obj()); auto stat = MakePtr(); stat->expression = assign; ifBlock->statements.Add(stat); } for (vint i = 0; i < info.handlerVariables.Count(); i++) { auto cacheName = info.handlerVariables.Keys()[i]; auto result = info.handlerVariables.Values()[i]; auto assign = MakePtr(); assign->op = WfBinaryOperator::Assign; assign->first = CreateReference(cacheName); assign->second = CreateDefaultValue(result.Obj()); auto stat = MakePtr(); stat->expression = assign; ifBlock->statements.Add(stat); } { auto literal = MakePtr(); literal->value = WfLiteralValue::True; auto returnStat = MakePtr(); returnStat->expression = literal; ifBlock->statements.Add(returnStat); } } { auto literal = MakePtr(); literal->value = WfLiteralValue::False; auto returnStat = MakePtr(); returnStat->expression = literal; block->statements.Add(returnStat); } return func; } /*********************************************************************** ExpandBindExpression ***********************************************************************/ void ExpandBindExpression(WfLexicalScopeManager* manager, WfBindExpression* node) { BindContext context; CreateBindContextVisitor(manager, context).Call(node->expression.Obj()); BindCallbackInfo bcInfo; auto newSubscription = MakePtr(); node->expandedExpression = newSubscription; { auto typeInfo = TypeInfoRetriver>::CreateTypeInfo(); newSubscription->type = GetTypeFromTypeInfo(typeInfo.Obj()); } { // stable symbol order by sorting them by code List orderedObserves; auto printExpression = [](WfExpression* observe) { return GenerateToStream([&](StreamWriter& writer) { WfPrint(observe, WString::Empty, writer); }); }; FOREACH_INDEXER(WfExpression*, parent, index, context.cachedExprs) { WString cacheName = context.GetCacheVariableName(index); { auto elementType = manager->expressionResolvings[parent].type; newSubscription->declarations.Add(AssignNormalMember(CreateWritableVariable(cacheName, elementType.Obj()))); } } FOREACH_INDEXER(WfExpression*, observe, observeIndex, context.orderedObserves) { const auto& events = context.observeEvents[observe]; FOREACH_INDEXER(IEventInfo*, ev, eventIndex, events) { WString handlerName = L"" + itow(observeIndex) + L"_" + itow(eventIndex); { auto elementType = TypeInfoRetriver>::CreateTypeInfo(); bcInfo.handlerVariables.Add(handlerName, elementType); newSubscription->declarations.Add(AssignNormalMember(CreateWritableVariable(handlerName, elementType.Obj()))); } WString callbackName = L"" + itow(observeIndex) + L"_" + itow(eventIndex); { auto elementType = CopyTypeInfo(ev->GetHandlerType()); bcInfo.callbackFunctions.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"", TypeInfoRetriver::CreateTypeInfo().Obj()))); newSubscription->declarations.Add(AssignNormalMember(CreateWritableVariable(L"", TypeInfoRetriver::CreateTypeInfo().Obj()))); { auto func = MakePtr(); func->name.value = L""; func->anonymity = WfFunctionAnonymity::Named; func->returnType = GetTypeFromTypeInfo(TypeInfoRetriver::CreateTypeInfo().Obj()); auto block = MakePtr(); func->statement = block; { auto var = MakePtr(); var->name.value = L""; var->expression = ExpandObserveExpressionVisitor::Execute(node->expression.Obj(), context); auto varStat = MakePtr(); varStat->variable = var; block->statements.Add(varStat); } { auto call = MakePtr(); call->function = CreateReference(L"ValueChanged"); call->arguments.Add(CreateReference(L"")); auto stat = MakePtr(); stat->expression = call; block->statements.Add(stat); } newSubscription->declarations.Add(AssignNormalMember(func)); } FOREACH(WfExpression*, observe, context.orderedObserves) { FOREACH(CallbackInfo, callbackInfo, bcInfo.observeCallbackInfos[observe]) { auto func = MakePtr(); func->name.value = callbackInfo.callbackName; func->anonymity = WfFunctionAnonymity::Named; { auto genericType = bcInfo.callbackFunctions[callbackInfo.callbackName]->GetElementType(); func->returnType = GetTypeFromTypeInfo(genericType->GetGenericArgument(0)); vint count = genericType->GetGenericArgumentCount(); for (vint i = 1; i < count; i++) { auto arg = MakePtr(); arg->name.value = L"" + itow(i - 1); arg->type = GetTypeFromTypeInfo(genericType->GetGenericArgument(i)); func->arguments.Add(arg); } } auto block = MakePtr(); func->statement = block; { List affected; affected.Add(observe); for (vint i = 0; i < affected.Count(); i++) { auto current = affected[i]; vint dependencyIndex = context.observeAffects.Keys().IndexOf(current); if (dependencyIndex != -1) { FOREACH(WfExpression*, affectedObserve, context.observeAffects.GetByIndex(dependencyIndex)) { if (affectedObserve && !affected.Contains(affectedObserve)) { affected.Add(affectedObserve); } } } } affected.Remove(observe); FOREACH(WfExpression*, affectedObserve, From(affected).Reverse()) { CreateBindDetachStatement(block, manager, affectedObserve, context, bcInfo); } { SortedList assignedParents; FOREACH(WfExpression*, affectedObserve, affected) { auto parent = context.GetCachedExpressionIndexRecursively(context.observeParents[affectedObserve], true); if (!assignedParents.Contains(parent)) { assignedParents.Add(parent); CreateBindCacheAssignStatement(manager, block, affectedObserve, context); } } } FOREACH(WfExpression*, affectedObserve, affected) { CreateBindAttachStatement(block, manager, affectedObserve, context, bcInfo); } } { auto ref = CreateReference(L""); auto call = MakePtr(); call->function = ref; auto stat = MakePtr(); stat->expression = call; block->statements.Add(stat); } newSubscription->declarations.Add(AssignNormalMember(func)); } } } newSubscription->declarations.Add(AssignOverrideMember(CreateBindOpenFunction(manager, context, bcInfo))); newSubscription->declarations.Add(AssignOverrideMember(CreateBindUpdateFunction(bcInfo))); newSubscription->declarations.Add(AssignOverrideMember(CreateBindCloseFunction(manager, context, 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(); node->expandedExpression = newExpr; newExpr->type = CopyType(node->type); { auto varDecl = MakePtr(); newExpr->declarations.Add(varDecl); { varDecl->classMember = MakePtr(); varDecl->classMember->kind = WfClassMemberKind::Normal; } varDecl->name.value = L""; varDecl->expression = CopyExpression(node->expression, true); if (sourceType->GetDecorator() == ITypeInfo::RawPtr) { auto tdType = MakePtr(sourceType->GetTypeDescriptor(), TypeInfoHint::Normal); auto pointerType = MakePtr(tdType); auto castExpr = MakePtr(); castExpr->strategy = WfTypeCastingStrategy::Strong; castExpr->expression = varDecl->expression; castExpr->type = GetTypeFromTypeInfo(pointerType.Obj()); varDecl->expression = castExpr; } } List 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(); newExpr->declarations.Add(funcDecl); { funcDecl->classMember = MakePtr(); 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(); argument->name.value = L"" + parameter->GetName(); argument->type = GetTypeFromTypeInfo(parameter->GetType()); funcDecl->arguments.Add(argument); } auto implBlock = MakePtr(); funcDecl->statement = implBlock; { auto refSource = MakePtr(); refSource->name.value = L""; auto memberExpr = MakePtr(); if (sourceType->GetTypeDescriptor() == method->GetOwnerTypeDescriptor()) { memberExpr->parent = refSource; } else if (sourceType->GetTypeDescriptor()->GetMethodGroupByName(method->GetName(), true) == method->GetOwnerMethodGroup()) { memberExpr->parent = refSource; } else { auto castExpr = MakePtr(); castExpr->strategy = WfTypeCastingStrategy::Strong; castExpr->expression = refSource; { auto tdType = MakePtr(sourceType->GetTypeDescriptor(), TypeInfoHint::Normal); auto pointerType = MakePtr(tdType); castExpr->type = GetTypeFromTypeInfo(pointerType.Obj()); } auto inferExpr = MakePtr(); inferExpr->expression = castExpr; { auto tdType = MakePtr(method->GetOwnerTypeDescriptor(), TypeInfoHint::Normal); auto pointerType = MakePtr(tdType); inferExpr->type = GetTypeFromTypeInfo(pointerType.Obj()); } memberExpr->parent = inferExpr; } memberExpr->name.value = method->GetName(); auto callExpr = MakePtr(); callExpr->function = memberExpr; for (vint l = 0; l < parameterCount; l++) { auto parameter = method->GetParameter(l); auto argumentExpr = MakePtr(); argumentExpr->name.value = L"" + parameter->GetName(); callExpr->arguments.Add(argumentExpr); } if (method->GetReturn()->GetTypeDescriptor() == description::GetTypeDescriptor()) { auto stat = MakePtr(); stat->expression = callExpr; implBlock->statements.Add(stat); } else { auto stat = MakePtr(); 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; Ptr GenerateCoroutineInvalidId() { auto refOne = MakePtr(); refOne->value.value = L"1"; auto refInvalid = MakePtr(); refInvalid->op = WfUnaryOperator::Negative; refInvalid->operand = refOne; return refInvalid; } /*********************************************************************** FindCoroutineAwaredStatements ***********************************************************************/ class FindCoroutineAwaredStatementVisitor : public empty_visitor::StatementVisitor { public: List& awaredStatements; bool awared = false; FindCoroutineAwaredStatementVisitor(List& _awaredStatements) :awaredStatements(_awaredStatements) { } bool Call(Ptr node) { if (!node) return false; awared = false; node->Accept(this); if (awared) { awaredStatements.Add(node.Obj()); } return awared; } void Dispatch(WfVirtualCseStatement* node)override { awared = Call(node->expandedStatement); } void Dispatch(WfCoroutineStatement* node)override { awared = true; } void Dispatch(WfStateMachineStatement* node)override { CHECK_FAIL(L"FindCoroutineAwaredStatementVisitor::Visit(WfStateMachineStatement*)#Internal error, state machine statement is not allowed in $coroutine expression."); } void Visit(WfBreakStatement* node)override { awared = true; } void Visit(WfContinueStatement* 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, stat, node->statements) { bool a = Call(stat); result |= a; } awared = result; } void Visit(WfGotoStatement* node)override { awared = true; } }; void FindCoroutineAwaredStatements(Ptr node, List& awaredStatements) { FindCoroutineAwaredStatementVisitor(awaredStatements).Call(node); } /*********************************************************************** FindCoroutineAwaredVariables ***********************************************************************/ class FindCoroutineAwaredVariableVisitor : public empty_visitor::StatementVisitor { public: List& awaredVariables; FindCoroutineAwaredVariableVisitor(List& _awaredVariables) :awaredVariables(_awaredVariables) { } void Dispatch(WfVirtualCseStatement* node)override { node->expandedStatement->Accept(this); } void Dispatch(WfCoroutineStatement* node)override { } void Dispatch(WfStateMachineStatement* node)override { CHECK_FAIL(L"FindCoroutineAwaredVariableVisitor::Visit(WfStateMachineStatement*)#Internal error, state machine statement is not allowed in $coroutine expression."); } void Visit(WfVariableStatement* node)override { awaredVariables.Add(node); } }; class FindCoroutineAwaredBlockVisitor : public empty_visitor::StatementVisitor { public: List& awaredVariables; FindCoroutineAwaredBlockVisitor(List& _awaredVariables) :awaredVariables(_awaredVariables) { } void Dispatch(WfVirtualCseStatement* 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 Dispatch(WfStateMachineStatement* node)override { CHECK_FAIL(L"FindCoroutineAwaredBlockVisitor::Visit(WfStateMachineStatement*)#Internal error, state machine statement is not allowed in $coroutine expression."); } void Visit(WfBlockStatement* node)override { FindCoroutineAwaredVariableVisitor visitor(awaredVariables); FOREACH(Ptr, stat, node->statements) { stat->Accept(&visitor); } } }; void FindCoroutineAwaredVariables(WfStatement* node, List& awaredVariables) { FindCoroutineAwaredBlockVisitor visitor(awaredVariables); node->Accept(&visitor); } /*********************************************************************** FindCoroutineReferenceRenaming ***********************************************************************/ void FindCoroutineReferenceRenaming(WfLexicalScopeManager* manager, List& awaredStatements, List& awaredVariables, Dictionary& 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"" + local; } else { return 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(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(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 condition; FlowChartNode* destination = nullptr; }; enum class FlowChartNodeAction { None, SetPause, }; class FlowChartNode : public Object { public: FlowChartNodeAction action = FlowChartNodeAction::None; bool embedInBranch = false; List> statements; List> branches; FlowChartNode* destination = nullptr; FlowChartNode* exceptionDestination = nullptr; FlowChartNode* pauseDestination = nullptr; WfLexicalSymbol* exceptionVariable = nullptr; }; class FlowChart : public Object { typedef Dictionary> TempExVarMap; public: List> nodes; FlowChartNode* headNode = nullptr; FlowChartNode* lastNode = nullptr; TempExVarMap tempExVars; FlowChartNode* CreateNode(FlowChartNode* catchNode) { auto node = MakePtr(); 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 CopyWithExpandVirtualVisitor { public: WfLexicalScopeManager* manager; Dictionary& referenceRenaming; GenerateFlowChartModuleVisitor(WfLexicalScopeManager* _manager, Dictionary& _referenceRenaming) :CopyWithExpandVirtualVisitor(true) , 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()->name.value = referenceRenaming.Values()[index]; } } } }; class GenerateFlowChartStatementVisitor : public Object , public WfStatement::IVisitor , public WfCoroutineStatement::IVisitor { public: enum class ScopeType { Function, Loop, TryCatch, Block, }; struct ScopeContext { ScopeContext* parent = nullptr; ScopeType type = ScopeType::Function; WString name; FlowChartNode* enterNode = nullptr; FlowChartNode* leaveNode = nullptr; ScopeContext* exitStatementScope = nullptr; Ptr exitStatement; }; public: WfLexicalScopeManager* manager; SortedList& awaredStatements; Dictionary& referenceRenaming; Ptr flowChart; FlowChartNode* headNode; FlowChartNode* catchNode; ScopeContext* scopeContext; FlowChartNode* resultHead = nullptr; FlowChartNode* resultLast = nullptr; GenerateFlowChartStatementVisitor(WfLexicalScopeManager* _manager, SortedList& _awaredStatements, Dictionary& _referenceRenaming, Ptr _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 statement) { if (!resultHead) { resultHead = flowChart->EnsureAppendStatement(headNode, catchNode); resultLast = resultHead; } resultLast = Execute(resultHead, catchNode, scopeContext, statement).value; } void AppendUnawaredCopiedStatement(FlowChartNode* catchNode, ScopeContext* scopeContext, Ptr statement) { if (!resultHead) { resultHead = flowChart->EnsureAppendStatement(headNode, catchNode); resultLast = resultHead; } resultHead->statements.Add(statement); } ScopeContext* InlineScopeExitCode(ScopeType untilScopeType, bool exclusive, const WString name = WString::Empty) { auto current = scopeContext; while (current) { bool found = false; if (current->type == untilScopeType) { if (name == L"" || current->name == name) { found = true; } } if (exclusive && found) break; if (current->exitStatement) { AppendAwaredStatement(catchNode, current->exitStatementScope, current->exitStatement); } if (!exclusive && found) break; current = current->parent; } return current; } static Pair Execute(WfLexicalScopeManager* manager, SortedList& awaredStatements, Dictionary& referenceRenaming, Ptr flowChart, FlowChartNode* headNode, FlowChartNode* catchNode, ScopeContext* scopeContext, Ptr 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 Execute(FlowChartNode* headNode, FlowChartNode* catchNode, ScopeContext* scopeContext, Ptr statement) { return Execute(manager, awaredStatements, referenceRenaming, flowChart, headNode, catchNode, scopeContext, statement); } void Visit(WfBreakStatement* node)override { auto targetContext = InlineScopeExitCode(ScopeType::Loop, false); resultHead = flowChart->EnsureAppendStatement(headNode, catchNode); resultLast = resultHead; auto branch = MakePtr(); branch->destination = targetContext->leaveNode; resultLast->branches.Add(branch); } void Visit(WfContinueStatement* node)override { auto targetContext = InlineScopeExitCode(ScopeType::Loop, true); resultHead = flowChart->EnsureAppendStatement(headNode, catchNode); resultLast = resultHead; auto branch = MakePtr(); branch->destination = targetContext->enterNode; resultLast->branches.Add(branch); } void Visit(WfReturnStatement* node)override { auto targetContext = InlineScopeExitCode(ScopeType::Function, false); AppendUnawaredCopiedStatement(catchNode, scopeContext, COPY_AST(node)); auto branch = MakePtr(); branch->destination = targetContext->leaveNode; resultLast->branches.Add(branch); } 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(); resultHead->branches.Add(branch); auto scope = manager->nodeScopes[node]; auto symbol = scope->symbols[node->name.value][0].Obj(); { auto refExpr = MakePtr(); refExpr->name.value = referenceRenaming[symbol]; auto assignExpr = MakePtr(); assignExpr->op = WfBinaryOperator::Assign; assignExpr->first = refExpr; assignExpr->second = COPY_AST(node->expression); auto stat = MakePtr(); stat->expression = assignExpr; SetCodeRange((Ptr)stat, node->expression->codeRange); resultHead->statements.Add(stat); } { auto refExpr = MakePtr(); refExpr->name.value = referenceRenaming[symbol]; auto testExpr = MakePtr(); testExpr->test = WfTypeTesting::IsNotNull; testExpr->expression = refExpr; SetCodeRange((Ptr)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(); 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(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(); resultHead->branches.Add(branch); branch->condition = COPY_AST(node->condition); } auto loopEnd = flowChart->CreateNode(catchNode); { auto branch = MakePtr(); 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(nullptr); symbol->name = L"ex"; symbol->typeInfo = TypeInfoRetriver>::CreateTypeInfo(); flowChart->tempExVars.Add(node, symbol); referenceRenaming.Add(symbol.Obj(), L"tempExVars.Count() - 1) + L">ex"); return symbol.Obj(); } return flowChart->tempExVars.Values()[index].Obj(); } } Pair GenerateCatch(WfTryStatement* node, FlowChartNode* catchNode) { auto pair = Execute(nullptr, catchNode, scopeContext, node->catchStatement); pair.key->exceptionVariable = GetExceptionVariableSymbol(node); return pair; } Pair GenerateFinally(WfTryStatement* node, FlowChartNode* catchNode) { return Execute(nullptr, catchNode, scopeContext, node->finallyStatement); } Pair 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(); refExpr->name.value = referenceRenaming[pair.key->exceptionVariable]; auto memberExpr = MakePtr(); memberExpr->parent = refExpr; memberExpr->name.value = L"Message"; auto raiseStat = MakePtr(); raiseStat->expression = memberExpr; SetCodeRange((Ptr)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 { if (node->endLabel.value == L"") { resultHead = flowChart->EnsureAppendStatement(headNode, catchNode); resultLast = resultHead; FOREACH_INDEXER(Ptr, stat, index, node->statements) { auto pair = Execute(resultLast, catchNode, scopeContext, stat); resultLast = pair.value; } } else { resultHead = flowChart->EnsureAppendStatement(headNode, catchNode); auto blockEnd = flowChart->CreateNode(catchNode); resultLast = resultHead; ScopeContext blockContext; blockContext.parent = scopeContext; blockContext.type = ScopeType::Block; blockContext.name = node->endLabel.value; blockContext.enterNode = resultHead; blockContext.leaveNode = blockEnd; FOREACH_INDEXER(Ptr, stat, index, node->statements) { auto pair = Execute(resultLast, catchNode, &blockContext, stat); resultLast = pair.value; } resultLast->destination = blockEnd; resultLast = blockEnd; } } void Visit(WfGotoStatement* node)override { auto targetContext = InlineScopeExitCode(ScopeType::Block, false, node->label.value); resultHead = flowChart->EnsureAppendStatement(headNode, catchNode); resultLast = resultHead; auto branch = MakePtr(); branch->destination = targetContext->leaveNode; resultLast->branches.Add(branch); } 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(); refExpr->name.value = referenceRenaming[symbol]; auto assignExpr = MakePtr(); assignExpr->op = WfBinaryOperator::Assign; assignExpr->first = refExpr; assignExpr->second = COPY_AST(node->variable->expression); auto stat = MakePtr(); stat->expression = assignExpr; SetCodeRange((Ptr)stat, node->codeRange); AppendUnawaredCopiedStatement(catchNode, scopeContext, stat); } void Visit(WfExpressionStatement* node)override { AppendUnawaredCopiedStatement(catchNode, scopeContext, COPY_AST(node)); } void Visit(WfVirtualCseStatement* node)override { node->expandedStatement->Accept(this); } void Visit(WfCoroutineStatement* node)override { node->Accept(static_cast(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(); SetCodeRange((Ptr)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."); } void Visit(WfStateMachineStatement* node)override { CHECK_FAIL(L"GenerateFlowChartStatementVisitor::Visit(WfStateMachineStatement*)#Internal error, state machine statement is not allowed in $coroutine expression."); } #undef COPY_STATEMENT }; Ptr GenerateFlowChart(WfLexicalScopeManager* manager, List& awaredStatements, List& awaredVariables, Dictionary& referenceRenaming, Ptr statement) { auto flowChart = MakePtr(); SortedList 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, Dictionary& enterCounts) { const auto& keys = enterCounts.Keys(); auto& values = const_cast::ValueContainer&>(enterCounts.Values()); FOREACH(Ptr, 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, node, flowChart->nodes) { Inc(node->destination); Inc(node->exceptionDestination); Inc(node->pauseDestination); FOREACH(Ptr, branch, node->branches) { Inc(branch->destination); } } } void RemoveUnnecessaryNodesPass(Ptr flowChart) { Dictionary enterCounts; CalculateEnterCounts(flowChart, enterCounts); SortedList mergableNodes; List> keepingNodes; FOREACH(Ptr, 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 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, 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, 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) { RemoveUnnecessaryNodesPass(flowChart); FOREACH(Ptr, node, flowChart->nodes) { if (node->pauseDestination && node->statements.Count() > 0 && node->statements[node->statements.Count() - 1].Cast()) { node->destination = nullptr; } } Dictionary enterCounts; CalculateEnterCounts(flowChart, enterCounts); FOREACH(Ptr, node, flowChart->nodes) { FOREACH(Ptr, branch, node->branches) { if (enterCounts[branch->destination] == 1) { branch->destination->embedInBranch = true; } } } } /*********************************************************************** GenerateSetStatus ***********************************************************************/ Ptr GenerateSetStatus(const WString& status) { auto refExpr = MakePtr(); refExpr->name.value = status; auto funcExpr = MakePtr(); funcExpr->name.value = L"SetStatus"; auto callExpr = MakePtr(); callExpr->function = funcExpr; callExpr->arguments.Add(refExpr); auto stat = MakePtr(); stat->expression = callExpr; return stat; }; /*********************************************************************** GenerateSetCoState ***********************************************************************/ Ptr GenerateSetCoStateBeforePause() { auto refBefore = MakePtr(); refBefore->name.value = L""; auto refState = MakePtr(); refState->name.value = L""; auto assignExpr = MakePtr(); assignExpr->op = WfBinaryOperator::Assign; assignExpr->first = refBefore; assignExpr->second = refState; auto stat = MakePtr(); stat->expression = assignExpr; return stat; } Ptr GenerateSetCoStateBeforePauseToInvalid() { auto refBefore = MakePtr(); refBefore->name.value = L""; auto assignExpr = MakePtr(); assignExpr->op = WfBinaryOperator::Assign; assignExpr->first = refBefore; assignExpr->second = GenerateCoroutineInvalidId(); auto stat = MakePtr(); stat->expression = assignExpr; return stat; } Ptr GenerateSetCoState(List& nodeOrders, FlowChartNode* node) { auto refState = MakePtr(); refState->name.value = L""; auto intState = MakePtr(); intState->value.value = itow(nodeOrders.IndexOf(node)); auto assignExpr = MakePtr(); assignExpr->op = WfBinaryOperator::Assign; assignExpr->first = refState; assignExpr->second = intState; auto stat = MakePtr(); stat->expression = assignExpr; return stat; }; /*********************************************************************** ExpandExceptionDestination ***********************************************************************/ Ptr ExpandExceptionDestination(FlowChartNode* catchNode, Dictionary& referenceRenaming, List& nodeOrders, Ptr stateBlock) { ///////////////////////////////////////////////////////////////////////////// // try { ... } ///////////////////////////////////////////////////////////////////////////// auto nodeTryStat = MakePtr(); auto nodeBlock = MakePtr(); nodeTryStat->protectedStatement = nodeBlock; ///////////////////////////////////////////////////////////////////////////// // catch() // { // THE_EXCEPTION_VARIABLE = ; // = THE_EXCEPTION_STATE; // continue; // } ///////////////////////////////////////////////////////////////////////////// nodeTryStat->name.value = L""; auto catchBlock = MakePtr(); nodeTryStat->catchStatement = catchBlock; { auto refTarget = MakePtr(); refTarget->name.value = referenceRenaming[catchNode->exceptionVariable]; auto refEx = MakePtr(); refEx->name.value = L""; auto assignExpr = MakePtr(); assignExpr->op = WfBinaryOperator::Assign; assignExpr->first = refTarget; assignExpr->second = refEx; auto stat = MakePtr(); stat->expression = assignExpr; catchBlock->statements.Add(stat); } catchBlock->statements.Add(GenerateSetCoState(nodeOrders, catchNode)); catchBlock->statements.Add(MakePtr()); stateBlock->statements.Add(nodeTryStat); return nodeBlock; } /*********************************************************************** ExpandFlowChartNode ***********************************************************************/ void ExpandFlowChartNode(Ptr flowChart, FlowChartNode* flowChartNode, Dictionary& referenceRenaming, List& nodeOrders, FlowChartNode* parentCatchNode, Ptr stateBlock) { if (flowChartNode->action == FlowChartNodeAction::SetPause) { ///////////////////////////////////////////////////////////////////////////// // = THE_NEXT_STATE; // SetStatus(Waiting); ///////////////////////////////////////////////////////////////////////////// stateBlock->statements.Add(GenerateSetStatus(L"Waiting")); stateBlock->statements.Add(GenerateSetCoStateBeforePause()); 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, stat, flowChartNode->statements) { if (stat.Cast()) { exited = true; ///////////////////////////////////////////////////////////////////////////// // return; ///////////////////////////////////////////////////////////////////////////// nodeBlock->statements.Add(MakePtr()); } else if (stat.Cast()) { exited = true; ///////////////////////////////////////////////////////////////////////////// // SetStatus(Stopped); // return; ///////////////////////////////////////////////////////////////////////////// stateBlock->statements.Add(GenerateSetStatus(L"Stopped")); { auto returnStat = MakePtr(); stateBlock->statements.Add(returnStat); } } else { if (stat.Cast()) { exited = true; } nodeBlock->statements.Add(stat); } } FOREACH(Ptr, branch, flowChartNode->branches) { Ptr trueBlock; if (branch->condition) { auto ifStat = MakePtr(); ifStat->expression = branch->condition; trueBlock = MakePtr(); ifStat->trueBranch = trueBlock; nodeBlock->statements.Add(ifStat); } else { trueBlock = nodeBlock; } 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()); } } if (!exited) { if (flowChartNode == flowChart->lastNode) { ///////////////////////////////////////////////////////////////////////////// // SetStatus(Stopped); // return; ///////////////////////////////////////////////////////////////////////////// stateBlock->statements.Add(GenerateSetStatus(L"Stopped")); { auto returnStat = MakePtr(); stateBlock->statements.Add(returnStat); } } else { ///////////////////////////////////////////////////////////////////////////// // = THE_NEXT_STATE; // continue; ///////////////////////////////////////////////////////////////////////////// stateBlock->statements.Add(GenerateSetCoState(nodeOrders, flowChartNode->destination)); stateBlock->statements.Add(MakePtr()); } } } /*********************************************************************** ExpandNewCoroutineExpression ***********************************************************************/ void ExpandNewCoroutineExpression(WfLexicalScopeManager* manager, WfNewCoroutineExpression* node) { List awaredStatements; List awaredVariables; Dictionary 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 nodeOrders; CopyFrom( nodeOrders, From(flowChart->nodes) .Select([](Ptr node) { return node.Obj(); }) .Where([](FlowChartNode* node) { return !node->embedInBranch; }) ); auto newExpr = MakePtr(); node->expandedExpression = newExpr; newExpr->type = GetTypeFromTypeInfo(TypeInfoRetriver>::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(); newExpr->declarations.Add(varDecl); { auto member = MakePtr(); member->kind = WfClassMemberKind::Normal; varDecl->classMember = member; } varDecl->name.value = referenceRenaming[symbol]; varDecl->type = GetTypeFromTypeInfo(symbol->typeInfo.Obj()); varDecl->expression = CreateDefaultValue(symbol->typeInfo.Obj()); } ///////////////////////////////////////////////////////////////////////////// // ///////////////////////////////////////////////////////////////////////////// { auto varDecl = MakePtr(); newExpr->declarations.Add(varDecl); { auto member = MakePtr(); member->kind = WfClassMemberKind::Normal; varDecl->classMember = member; } varDecl->name.value = L""; varDecl->type = GetTypeFromTypeInfo(TypeInfoRetriver::CreateTypeInfo().Obj()); auto stateExpr = MakePtr(); stateExpr->value.value = L"0"; varDecl->expression = stateExpr; } ///////////////////////////////////////////////////////////////////////////// // ///////////////////////////////////////////////////////////////////////////// { auto varDecl = MakePtr(); newExpr->declarations.Add(varDecl); { auto member = MakePtr(); member->kind = WfClassMemberKind::Normal; varDecl->classMember = member; } varDecl->name.value = L""; varDecl->type = GetTypeFromTypeInfo(TypeInfoRetriver::CreateTypeInfo().Obj()); varDecl->expression = GenerateCoroutineInvalidId(); } ///////////////////////////////////////////////////////////////////////////// // prop Failure : Exception^ {const, not observe} ///////////////////////////////////////////////////////////////////////////// { auto propDecl = MakePtr(); newExpr->declarations.Add(propDecl); { auto member = MakePtr(); member->kind = WfClassMemberKind::Override; propDecl->classMember = member; } propDecl->name.value = L"Failure"; propDecl->type = GetTypeFromTypeInfo(TypeInfoRetriver>::CreateTypeInfo().Obj()); propDecl->configConst = WfAPConst::Readonly; propDecl->configObserve = WfAPObserve::NotObservable; auto nullExpr = MakePtr(); nullExpr->value = WfLiteralValue::Null; propDecl->expression = nullExpr; } ///////////////////////////////////////////////////////////////////////////// // prop Status : CoroutineStatus^ {const, not observe} ///////////////////////////////////////////////////////////////////////////// { auto propDecl = MakePtr(); newExpr->declarations.Add(propDecl); { auto member = MakePtr(); member->kind = WfClassMemberKind::Override; propDecl->classMember = member; } propDecl->name.value = L"Status"; propDecl->type = GetTypeFromTypeInfo(TypeInfoRetriver::CreateTypeInfo().Obj()); propDecl->configConst = WfAPConst::Readonly; propDecl->configObserve = WfAPObserve::NotObservable; auto refExpr = MakePtr(); refExpr->name.value = L"Waiting"; propDecl->expression = refExpr; } ///////////////////////////////////////////////////////////////////////////// // func Resume( : bool, : CoroutineResult^) : void ///////////////////////////////////////////////////////////////////////////// WString coResultName = node->name.value == L"" ? L"" : node->name.value; { auto funcDecl = MakePtr(); newExpr->declarations.Add(funcDecl); { auto member = MakePtr(); member->kind = WfClassMemberKind::Override; funcDecl->classMember = member; } funcDecl->anonymity = WfFunctionAnonymity::Named; funcDecl->name.value = L"Resume"; funcDecl->returnType = GetTypeFromTypeInfo(TypeInfoRetriver::CreateTypeInfo().Obj()); { auto argument = MakePtr(); funcDecl->arguments.Add(argument); argument->name.value = L""; argument->type = GetTypeFromTypeInfo(TypeInfoRetriver::CreateTypeInfo().Obj()); } { auto argument = MakePtr(); funcDecl->arguments.Add(argument); argument->name.value = coResultName; argument->type = GetTypeFromTypeInfo(TypeInfoRetriver>::CreateTypeInfo().Obj()); } auto block = MakePtr(); funcDecl->statement = block; ///////////////////////////////////////////////////////////////////////////// // if (Status != Waiting) raise "..."; ///////////////////////////////////////////////////////////////////////////// { auto ifStat = MakePtr(); { auto refStatus = MakePtr(); refStatus->name.value = L"Status"; auto waitingStatus = MakePtr(); waitingStatus->parent = GetExpressionFromTypeDescriptor(description::GetTypeDescriptor()); waitingStatus->name.value = L"Waiting"; auto compExpr = MakePtr(); compExpr->op = WfBinaryOperator::NE; compExpr->first = refStatus; compExpr->second = waitingStatus; ifStat->expression = compExpr; } auto trueBlock = MakePtr(); ifStat->trueBranch = trueBlock; { auto exExpr = MakePtr(); exExpr->value.value = L"Resume should be called only when the coroutine is in the waiting status."; auto raiseStat = MakePtr(); raiseStat->expression = exExpr; trueBlock->statements.Add(raiseStat); } block->statements.Add(ifStat); } ///////////////////////////////////////////////////////////////////////////// // SetStatus(Executing); ///////////////////////////////////////////////////////////////////////////// block->statements.Add(GenerateSetStatus(L"Executing")); { ///////////////////////////////////////////////////////////////////////////// // try { ... } ///////////////////////////////////////////////////////////////////////////// auto tryStat = MakePtr(); auto tryBlock = MakePtr(); tryStat->protectedStatement = tryBlock; { ///////////////////////////////////////////////////////////////////////////// // if ((); { auto refBefore = MakePtr(); refBefore->name.value = L""; auto compareInput = MakePtr(); compareInput->op = WfBinaryOperator::NE; compareInput->first = refBefore; compareInput->second = GenerateCoroutineInvalidId(); auto ifStat = MakePtr(); tryBlock->statements.Add(ifStat); ifStat->expression = compareInput; ifStat->trueBranch = trueBlock; } ///////////////////////////////////////////////////////////////////////////// // if ( is null) { = -1; } // else if (.Failure is null) { = -1; } // else { ... } ///////////////////////////////////////////////////////////////////////////// { auto nullTrueBlock = MakePtr(); Ptr* nullFalseBlock = nullptr; auto exTrueBlock = MakePtr(); auto exFalseBlock = MakePtr(); { auto refOutput = MakePtr(); refOutput->name.value = coResultName; auto testNullExpr = MakePtr(); testNullExpr->test = WfTypeTesting::IsNull; testNullExpr->expression = refOutput; auto ifStat = MakePtr(); trueBlock->statements.Add(ifStat); ifStat->expression = testNullExpr; ifStat->trueBranch = nullTrueBlock; nullTrueBlock->statements.Add(GenerateSetCoStateBeforePauseToInvalid()); nullFalseBlock = &ifStat->falseBranch; } { auto refOutput = MakePtr(); refOutput->name.value = coResultName; auto refFailure = MakePtr(); refFailure->parent = refOutput; refFailure->name.value = L"Failure"; auto testNullExpr = MakePtr(); testNullExpr->test = WfTypeTesting::IsNull; testNullExpr->expression = refFailure; auto ifStat = MakePtr(); *nullFalseBlock = ifStat; ifStat->expression = testNullExpr; ifStat->trueBranch = exTrueBlock; exTrueBlock->statements.Add(GenerateSetCoStateBeforePauseToInvalid()); ifStat->falseBranch = exFalseBlock; } { ///////////////////////////////////////////////////////////////////////////// // Handle exception from ///////////////////////////////////////////////////////////////////////////// Ptr firstIfStatement; Ptr* currentIfVar = &firstIfStatement; using GroupPair = Pair>; 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; if (!catchNode) continue; Ptr condition; { List> conditionRanges; FOREACH(FlowChartNode*, flowChartNode, group.value) { vint state = nodeOrders.IndexOf(flowChartNode); if (conditionRanges.Count() == 0) { conditionRanges.Add({ state,state }); } else if (conditionRanges[conditionRanges.Count() - 1].f1 == state - 1) { conditionRanges[conditionRanges.Count() - 1].f1 = state; } else { conditionRanges.Add({ state,state }); } } for (vint i = 0; i < conditionRanges.Count(); i++) { auto range = conditionRanges[i]; Ptr singleCondition; if (range.f0 == range.f1) { auto refState = MakePtr(); refState->name.value = L""; auto intState = MakePtr(); intState->value.value = itow(range.f0); auto compExpr = MakePtr(); compExpr->op = WfBinaryOperator::EQ; compExpr->first = refState; compExpr->second = intState; singleCondition = compExpr; } else { auto refState = MakePtr(); refState->name.value = L""; auto intState1 = MakePtr(); intState1->value.value = itow(range.f0); auto intState2 = MakePtr(); intState2->value.value = itow(range.f1); auto rangeExpr = MakePtr(); rangeExpr->begin = intState1; rangeExpr->beginBoundary = WfRangeBoundary::Inclusive; rangeExpr->end = intState2; rangeExpr->endBoundary = WfRangeBoundary::Inclusive; auto compExpr = MakePtr(); compExpr->test = WfSetTesting::In; compExpr->element = refState; compExpr->collection = rangeExpr; singleCondition = compExpr; } if (condition) { auto orExpr = MakePtr(); orExpr->op = WfBinaryOperator::Or; orExpr->first = condition; orExpr->second = singleCondition; condition = orExpr; } else { condition = singleCondition; } } } auto ifStat = MakePtr(); *currentIfVar = ifStat; currentIfVar = &ifStat->falseBranch; ifStat->expression = condition; auto catchBlock = MakePtr(); ifStat->trueBranch = catchBlock; catchBlock->statements.Add(GenerateSetCoStateBeforePauseToInvalid()); { auto refTarget = MakePtr(); refTarget->name.value = referenceRenaming[catchNode->exceptionVariable]; auto refOutput = MakePtr(); refOutput->name.value = coResultName; auto refFailure = MakePtr(); refFailure->parent = refOutput; refFailure->name.value = L"Failure"; auto assignExpr = MakePtr(); assignExpr->op = WfBinaryOperator::Assign; assignExpr->first = refTarget; assignExpr->second = refFailure; auto stat = MakePtr(); stat->expression = assignExpr; catchBlock->statements.Add(stat); } catchBlock->statements.Add(GenerateSetCoState(nodeOrders, catchNode)); } { auto block = MakePtr(); *currentIfVar = block; block->statements.Add(GenerateSetCoStateBeforePauseToInvalid()); { auto refOutput = MakePtr(); refOutput->name.value = coResultName; auto refFailure = MakePtr(); refFailure->parent = refOutput; refFailure->name.value = L"Failure"; auto raiseStat = MakePtr(); raiseStat->expression = refFailure; block->statements.Add(raiseStat); } } exFalseBlock->statements.Add(firstIfStatement); } } } { ///////////////////////////////////////////////////////////////////////////// // while (true) { ... } ///////////////////////////////////////////////////////////////////////////// auto whileStat = MakePtr(); { auto trueExpr = MakePtr(); trueExpr->value = WfLiteralValue::True; whileStat->condition = trueExpr; } auto whileBlock = MakePtr(); whileStat->statement = whileBlock; using GroupPair = Pair>; 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 ( == THE_CURRENT_STATE) { ... } ///////////////////////////////////////////////////////////////////////////// auto ifStat = MakePtr(); groupBlock->statements.Add(ifStat); { auto refState = MakePtr(); refState->name.value = L""; auto intState = MakePtr(); intState->value.value = itow(nodeOrders.IndexOf(flowChartNode)); auto compExpr = MakePtr(); compExpr->op = WfBinaryOperator::EQ; compExpr->first = refState; compExpr->second = intState; ifStat->expression = compExpr; } auto stateBlock = MakePtr(); ifStat->trueBranch = stateBlock; { ExpandFlowChartNode(flowChart, flowChartNode, referenceRenaming, nodeOrders, catchNode, stateBlock); } } } tryBlock->statements.Add(whileStat); } ///////////////////////////////////////////////////////////////////////////// // catch() // { // SetFailure(); // SetStatus(Stopped); // if () raise ; // } ///////////////////////////////////////////////////////////////////////////// tryStat->name.value = L""; auto catchBlock = MakePtr(); tryStat->catchStatement = catchBlock; { auto refExpr = MakePtr(); refExpr->name.value = L""; auto funcExpr = MakePtr(); funcExpr->name.value = L"SetFailure"; auto callExpr = MakePtr(); callExpr->function = funcExpr; callExpr->arguments.Add(refExpr); auto stat = MakePtr(); stat->expression = callExpr; catchBlock->statements.Add(stat); } catchBlock->statements.Add(GenerateSetStatus(L"Stopped")); { auto refExpr = MakePtr(); refExpr->name.value = L""; auto ifStat = MakePtr(); ifStat->expression = refExpr; auto trueBlock = MakePtr(); ifStat->trueBranch = trueBlock; { auto raiseStat = MakePtr(); trueBlock->statements.Add(raiseStat); } catchBlock->statements.Add(ifStat); } block->statements.Add(tryStat); } } } /*********************************************************************** ExpandNewCoroutineExpression ***********************************************************************/ void ExpandCoOperatorExpression(WfLexicalScopeManager* manager, WfCoOperatorExpression* node) { auto scope = manager->nodeScopes[node].Obj(); auto functionScope = scope->FindFunctionScope(); auto newCoExpr = functionScope->ownerNode.Cast(); auto providerType = manager->coNewCoroutineResolvings[newCoExpr.Obj()].type; auto refProvider = GetExpressionFromTypeDescriptor(providerType->GetTypeDescriptor()); auto refQueryContext = MakePtr(); refQueryContext->parent = refProvider; refQueryContext->name.value = L"QueryContext"; auto refImpl = MakePtr(); refImpl->name.value = L""; auto refCall = MakePtr(); refCall->function = refQueryContext; refCall->arguments.Add(refImpl); auto refOperator = MakePtr(); refOperator->parent = refCall; refOperator->name.value = node->name.value; node->expandedExpression = refOperator; } } } } /*********************************************************************** .\ANALYZER\WFANALYZER_EXPANDSTATEMACHINE.CPP ***********************************************************************/ namespace vl { namespace workflow { namespace analyzer { using namespace collections; using namespace reflection; using namespace reflection::description; /*********************************************************************** ExpandStateMachineStatementVisitor ***********************************************************************/ Ptr GenerateStateMachineInvalidId() { auto refOne = MakePtr(); refOne->value.value = L"1"; auto refInvalid = MakePtr(); refInvalid->op = WfUnaryOperator::Negative; refInvalid->operand = refOne; return refInvalid; } class ExpandStateMachineStatementVisitor : public copy_visitor::StatementVisitor , public copy_visitor::VirtualCseStatementVisitor , public WfStateMachineStatement::IVisitor { protected: WfLexicalScopeManager* manager; WfStateMachineInfo* smInfo; public: ExpandStateMachineStatementVisitor(WfLexicalScopeManager* _manager, WfStateMachineInfo* _smInfo) :manager(_manager) , smInfo(_smInfo) { } vl::Ptr CreateField(vl::Ptr from)override { return CopyExpression(from, true); } vl::Ptr CreateField(vl::Ptr from)override { return CopyType(from); } vl::Ptr CreateField(vl::Ptr from)override { if (!from) return nullptr; from->Accept(this); return result.Cast(); } vl::Ptr Dispatch(WfVirtualCseStatement* node)override { node->Accept((WfVirtualCseStatement::IVisitor*)this); return result; } vl::Ptr Dispatch(WfCoroutineStatement* node)override { CHECK_FAIL(L"ExpandStateMachineStatementVisitor::Dispatch(WfCoroutineStatement*)#ValidateStatementStructure should check coroutine statement's location."); } vl::Ptr Dispatch(WfStateMachineStatement* node)override { node->Accept((WfStateMachineStatement::IVisitor*)this); return result; } Ptr GenerateIngoreInputStatement() { auto refThis = MakePtr(); refThis->name.value = L"stateMachineObject"; auto refInput = MakePtr(); refInput->parent = refThis; refInput->name.value = L"stateMachineInput"; auto assignExpr = MakePtr(); assignExpr->op = WfBinaryOperator::Assign; assignExpr->first = refInput; assignExpr->second = GenerateStateMachineInvalidId(); auto exprStat = MakePtr(); exprStat->expression = assignExpr; return exprStat; } void GenerateStateSwitchCase(const WString& inputName, WfLexicalScope* smcScope, Ptr switchStat, Ptr& input, Ptr& caseBlock) { input = From(smcScope->symbols[inputName]) .Select([=](Ptr symbol) { return symbol->creatorNode.Cast(); }) .Where([=](Ptr decl) { return decl != nullptr; }) .First(); auto switchCase = MakePtr(); switchStat->caseBranches.Add(switchCase); { auto refInputId = MakePtr(); refInputId->value.value = itow(smInfo->inputIds[inputName]); switchCase->expression = refInputId; } caseBlock = MakePtr(); switchCase->statement = caseBlock; caseBlock->statements.Add(GenerateIngoreInputStatement()); } void Visit(WfStateSwitchStatement* node)override { auto smcScope = manager->nodeScopes[node]->FindFunctionScope()->parentScope.Obj(); auto block = MakePtr(); { auto refThis = MakePtr(); refThis->name.value = L"stateMachineObject"; auto refInput = MakePtr(); refInput->parent = refThis; refInput->name.value = L"stateMachineInput"; auto compareInput = MakePtr(); compareInput->op = WfBinaryOperator::EQ; compareInput->first = refInput; compareInput->second = GenerateStateMachineInvalidId(); auto ifStat = MakePtr(); block->statements.Add(ifStat); ifStat->expression = compareInput; auto trueBlock = MakePtr(); ifStat->trueBranch = trueBlock; trueBlock->statements.Add(MakePtr()); } auto switchStat = MakePtr(); { auto refThis = MakePtr(); refThis->name.value = L"stateMachineObject"; auto refInput = MakePtr(); refInput->parent = refThis; refInput->name.value = L"stateMachineInput"; switchStat->expression = refInput; } block->statements.Add(switchStat); FOREACH(Ptr, stateSwitchCase, node->caseBranches) { Ptr input; Ptr caseBlock; GenerateStateSwitchCase(stateSwitchCase->name.value, smcScope, switchStat, input, caseBlock); FOREACH_INDEXER(Ptr, argument, index, stateSwitchCase->arguments) { auto refThis = MakePtr(); refThis->name.value = L"stateMachineObject"; auto refArgument = MakePtr(); refArgument->parent = refThis; refArgument->name.value = manager->stateInputArguments[input->arguments[index].Obj()]->GetName(); auto varDecl = MakePtr(); varDecl->name.value = argument->name.value; varDecl->expression = refArgument; auto varStat = MakePtr(); varStat->variable = varDecl; caseBlock->statements.Add(varStat); } caseBlock->statements.Add(CreateField(stateSwitchCase->statement)); SetCodeRange(Ptr(caseBlock), stateSwitchCase->codeRange); } if (node->type == WfStateSwitchType::Default) { auto invalidInputs= From(smInfo->inputIds.Keys()) .Except( From(node->caseBranches) .Select([](Ptr switchCase) {return switchCase->name.value; }) ); FOREACH(WString, inputName, invalidInputs) { Ptr input; Ptr caseBlock; GenerateStateSwitchCase(inputName, smcScope, switchStat, input, caseBlock); { auto refException = MakePtr(); refException->value.value = L"Method \"" + inputName + L"\" of class \"" + manager->stateInputMethods[input.Obj()]->GetOwnerTypeDescriptor()->GetTypeName() + L"\" cannot be called at this moment."; auto raiseStat = MakePtr(); raiseStat->expression = refException; caseBlock->statements.Add(raiseStat); } } } auto defaultBlock = MakePtr(); switch (node->type) { case WfStateSwitchType::Default: case WfStateSwitchType::Pass: break; case WfStateSwitchType::PassAndReturn: { auto gotoStat = MakePtr(); gotoStat->label.value = L"OUT_OF_STATE_MACHINE"; defaultBlock->statements.Add(gotoStat); } break; case WfStateSwitchType::Ignore: { defaultBlock->statements.Add(GenerateIngoreInputStatement()); } break; case WfStateSwitchType::IgnoreAndReturn: { defaultBlock->statements.Add(GenerateIngoreInputStatement()); auto gotoStat = MakePtr(); gotoStat->label.value = L"OUT_OF_STATE_MACHINE"; defaultBlock->statements.Add(gotoStat); } break; } if (defaultBlock->statements.Count() > 0) { switchStat->defaultBranch = defaultBlock; } SetCodeRange(Ptr(block), node->codeRange); result = block; } void Visit(WfStateInvokeStatement* node)override { auto smcScope = manager->nodeScopes[node]->FindFunctionScope()->parentScope.Obj(); auto stateDecl = From(smcScope->symbols[node->name.value]) .Select([=](Ptr symbol) { return symbol->creatorNode.Cast(); }) .Where([=](Ptr decl) { return decl != nullptr; }) .First(); auto block = MakePtr(); FOREACH_INDEXER(Ptr, argument, index, stateDecl->arguments) { auto refThis = MakePtr(); refThis->name.value = L"stateMachineObject"; auto refArgument = MakePtr(); refArgument->parent = refThis; refArgument->name.value = manager->stateDeclArguments[argument.Obj()]->GetName(); auto assignExpr = MakePtr(); assignExpr->op = WfBinaryOperator::Assign; assignExpr->first = refArgument; assignExpr->second = CreateField(node->arguments[index]); auto exprStat = MakePtr(); exprStat->expression = assignExpr; block->statements.Add(exprStat); } switch (node->type) { case WfStateInvokeType::Goto: { { auto refState = MakePtr(); refState->name.value = L"state"; auto refStateId = MakePtr(); refStateId->value.value = itow(smInfo->stateIds[node->name.value]); auto assignExpr = MakePtr(); assignExpr->op = WfBinaryOperator::Assign; assignExpr->first = refState; assignExpr->second = refStateId; auto exprStat = MakePtr(); exprStat->expression = assignExpr; block->statements.Add(exprStat); } { auto gotoStat = MakePtr(); gotoStat->label.value = L"OUT_OF_CURRENT_STATE"; block->statements.Add(gotoStat); } } break; case WfStateInvokeType::Push: { { auto refThis = MakePtr(); refThis->name.value = L"stateMachineObject"; auto refCoroutine = MakePtr(); refCoroutine->parent = refThis; refCoroutine->name.value = L"CreateCoroutine"; auto refStateId = MakePtr(); refStateId->value.value = itow(smInfo->stateIds[node->name.value]); auto callExpr = MakePtr(); callExpr->function = refCoroutine; callExpr->arguments.Add(refStateId); auto exprStat = MakePtr(); exprStat->expression = callExpr; block->statements.Add(exprStat); } { block->statements.Add(MakePtr()); } } break; } SetCodeRange(Ptr(block), node->codeRange); result = block; } }; /*********************************************************************** ExpandStateMachine ***********************************************************************/ void ExpandStateMachine(WfLexicalScopeManager* manager, WfStateMachineDeclaration* node) { auto& smInfo = manager->stateMachineInfos[node]; FOREACH(Ptr, input, node->inputs) { smInfo->inputIds.Add(input->name.value, smInfo->inputIds.Count()); FOREACH(Ptr, argument, input->arguments) { // var NAME = ; auto fieldInfo = manager->stateInputArguments[argument.Obj()]; auto varDecl = MakePtr(); varDecl->name.value = fieldInfo->GetName(); varDecl->type = GetTypeFromTypeInfo(fieldInfo->GetReturn()); varDecl->expression = CreateDefaultValue(fieldInfo->GetReturn()); auto classMember = MakePtr(); classMember->kind = WfClassMemberKind::Normal; varDecl->classMember = classMember; auto att = MakePtr(); att->category.value = L"cpp"; att->name.value = L"Private"; varDecl->attributes.Add(att); node->expandedDeclarations.Add(varDecl); manager->declarationMemberInfos.Add(varDecl, fieldInfo); } } smInfo->stateIds.Add(L"", 0); FOREACH(Ptr, state, node->states) { if (state->name.value != L"") { smInfo->stateIds.Add(state->name.value, smInfo->stateIds.Count()); } FOREACH(Ptr, argument, state->arguments) { // var NAME = ; auto fieldInfo = manager->stateDeclArguments[argument.Obj()]; auto varDecl = MakePtr(); varDecl->name.value = fieldInfo->GetName(); varDecl->type = GetTypeFromTypeInfo(fieldInfo->GetReturn()); varDecl->expression = CreateDefaultValue(fieldInfo->GetReturn()); auto classMember = MakePtr(); classMember->kind = WfClassMemberKind::Normal; varDecl->classMember = classMember; auto att = MakePtr(); att->category.value = L"cpp"; att->name.value = L"Private"; varDecl->attributes.Add(att); node->expandedDeclarations.Add(varDecl); manager->declarationMemberInfos.Add(varDecl, fieldInfo); } } FOREACH(Ptr, input, node->inputs) { auto methodInfo = manager->stateInputMethods[input.Obj()]; // func INPUT(ARGUMENTS ...): void auto funcDecl = MakePtr(); funcDecl->anonymity = WfFunctionAnonymity::Named; funcDecl->name.value = methodInfo->GetName(); funcDecl->returnType = GetTypeFromTypeInfo(methodInfo->GetReturn()); FOREACH_INDEXER(Ptr, argument, index, input->arguments) { auto funcArgument = MakePtr(); funcArgument->name.value = argument->name.value; funcArgument->type = GetTypeFromTypeInfo(methodInfo->GetParameter(index)->GetType()); funcDecl->arguments.Add(funcArgument); } auto classMember = MakePtr(); classMember->kind = WfClassMemberKind::Normal; funcDecl->classMember = classMember; node->expandedDeclarations.Add(funcDecl); manager->declarationMemberInfos.Add(funcDecl, methodInfo); auto block = MakePtr(); funcDecl->statement = block; { // if (not this.stateMachineInitialized) auto trueBlock = MakePtr(); { auto refInit = MakePtr(); refInit->parent = MakePtr(); refInit->name.value = L"stateMachineInitialized"; auto notExpr = MakePtr(); notExpr->op = WfUnaryOperator::Not; notExpr->operand = refInit; auto ifStat = MakePtr(); ifStat->expression = notExpr; ifStat->trueBranch = trueBlock; block->statements.Add(ifStat); } { // this.stateMachineInitialized = true; auto refInit = MakePtr(); refInit->parent = MakePtr(); refInit->name.value = L"stateMachineInitialized"; auto refTrue = MakePtr(); refTrue->value = WfLiteralValue::True; auto assignExpr = MakePtr(); assignExpr->op = WfBinaryOperator::Assign; assignExpr->first = refInit; assignExpr->second = refTrue; auto exprStat = MakePtr(); exprStat->expression = assignExpr; trueBlock->statements.Add(exprStat); } { // this.CreateCoroutine(0); auto refCC = MakePtr(); refCC->parent = MakePtr(); refCC->name.value = smInfo->createCoroutineMethod->GetName(); auto refZero = MakePtr(); refZero->value.value = L"0"; auto callExpr = MakePtr(); callExpr->function = refCC; callExpr->arguments.Add(refZero); auto exprStat = MakePtr(); exprStat->expression = callExpr; trueBlock->statements.Add(exprStat); } { // this.ResumeStateMachine(); auto refResume = MakePtr(); refResume->parent = MakePtr(); refResume->name.value = L"ResumeStateMachine"; auto callExpr = MakePtr(); callExpr->function = refResume; auto exprStat = MakePtr(); exprStat->expression = callExpr; trueBlock->statements.Add(exprStat); } } { // this.stateMachineInput = auto refInput = MakePtr(); refInput->parent = MakePtr(); refInput->name.value = L"stateMachineInput"; auto refInputId = MakePtr(); refInputId->value.value = itow(smInfo->inputIds[input->name.value]); auto assignExpr = MakePtr(); assignExpr->op = WfBinaryOperator::Assign; assignExpr->first = refInput; assignExpr->second = refInputId; auto exprStat = MakePtr(); exprStat->expression = assignExpr; block->statements.Add(exprStat); } FOREACH_INDEXER(Ptr, argument, index, input->arguments) { // this.NAME = NAME; auto refField = MakePtr(); refField->parent = MakePtr(); refField->name.value = manager->stateInputArguments[argument.Obj()]->GetName(); auto refArgument = MakePtr(); refArgument->name.value = methodInfo->GetParameter(index)->GetName(); auto assignExpr = MakePtr(); assignExpr->op = WfBinaryOperator::Assign; assignExpr->first = refField; assignExpr->second = refArgument; auto exprStat = MakePtr(); exprStat->expression = assignExpr; block->statements.Add(exprStat); } { // this.ResumeStateMachine(); auto refResume = MakePtr(); refResume->parent = MakePtr(); refResume->name.value = L"ResumeStateMachine"; auto callExpr = MakePtr(); callExpr->function = refResume; auto exprStat = MakePtr(); exprStat->expression = callExpr; block->statements.Add(exprStat); } } { // func CreateCoroutine(startState: int): void auto funcDecl = MakePtr(); funcDecl->anonymity = WfFunctionAnonymity::Named; funcDecl->name.value = smInfo->createCoroutineMethod->GetName(); funcDecl->returnType = GetTypeFromTypeInfo(TypeInfoRetriver::CreateTypeInfo().Obj()); { auto parameterInfo = smInfo->createCoroutineMethod->GetParameter(0); auto funcArgument = MakePtr(); funcArgument->name.value = parameterInfo->GetName(); funcArgument->type = GetTypeFromTypeInfo(parameterInfo->GetType()); funcDecl->arguments.Add(funcArgument); } auto classMember = MakePtr(); classMember->kind = WfClassMemberKind::Normal; funcDecl->classMember = classMember; auto att = MakePtr(); att->category.value = L"cpp"; att->name.value = L"Private"; funcDecl->attributes.Add(att); node->expandedDeclarations.Add(funcDecl); manager->declarationMemberInfos.Add(funcDecl, smInfo->createCoroutineMethod); auto block = MakePtr(); funcDecl->statement = block; { // stateMachineObject = this; auto varDecl = MakePtr(); varDecl->name.value = L"stateMachineObject"; varDecl->expression = MakePtr(); auto stat = MakePtr(); stat->variable = varDecl; block->statements.Add(stat); } { // previousCoroutine = stateMachineCoroutine; auto refThis = MakePtr(); refThis->name.value = L"stateMachineObject"; auto refCoroutine = MakePtr(); refCoroutine->parent = refThis; refCoroutine->name.value = L"stateMachineCoroutine"; auto varDecl = MakePtr(); varDecl->name.value = L"previousCoroutine"; varDecl->expression = refCoroutine; auto stat = MakePtr(); stat->variable = varDecl; block->statements.Add(stat); } { // stateMachineCoroutine = $coroutine{ ... } auto refThis = MakePtr(); refThis->name.value = L"stateMachineObject"; auto refCoroutine = MakePtr(); refCoroutine->parent = refThis; refCoroutine->name.value = L"stateMachineCoroutine"; auto coroutine = MakePtr(); auto coroutineBlock = MakePtr(); coroutine->statement = coroutineBlock; auto assignExpr = MakePtr(); assignExpr->op = WfBinaryOperator::Assign; assignExpr->first = refCoroutine; assignExpr->second = coroutine; auto exprStat = MakePtr(); exprStat->expression = assignExpr; block->statements.Add(exprStat); { auto tryStat = MakePtr(); coroutineBlock->statements.Add(tryStat); auto tryBlock = MakePtr(); tryBlock->endLabel.value = L"OUT_OF_STATE_MACHINE"; tryStat->protectedStatement = tryBlock; auto finallyBlock = MakePtr(); tryStat->finallyStatement = finallyBlock; // try {... OUT_OF_STATE_MACHINE:;} { // var State = startState; auto refStartState = MakePtr(); refStartState->name.value = L"startState"; auto varDecl = MakePtr(); varDecl->name.value = L"state"; varDecl->expression = refStartState; auto stat = MakePtr(); stat->variable = varDecl; tryBlock->statements.Add(stat); } { // while(true){... OUT_OF_CURRENT_STATE:;} auto whileBlock = MakePtr(); whileBlock->endLabel.value = L"OUT_OF_CURRENT_STATE"; { auto refTrue = MakePtr(); refTrue->value = WfLiteralValue::True; auto whileStat = MakePtr(); whileStat->condition = refTrue; whileStat->statement = whileBlock; tryBlock->statements.Add(whileStat); } { // var currentState = state; auto refStartState = MakePtr(); refStartState->name.value = L"state"; auto varDecl = MakePtr(); varDecl->name.value = L"currentState"; varDecl->expression = refStartState; auto stat = MakePtr(); stat->variable = varDecl; whileBlock->statements.Add(stat); } { // state = -1; auto refState = MakePtr(); refState->name.value = L"state"; auto assignExpr = MakePtr(); assignExpr->op = WfBinaryOperator::Assign; assignExpr->first = refState; assignExpr->second = GenerateStateMachineInvalidId(); auto exprStat = MakePtr(); exprStat->expression = assignExpr; whileBlock->statements.Add(exprStat); } { // switch(currentState) { case STATE:{... goto OUT_OF_STATE_MACHINE;} ... } auto refCurrentState = MakePtr(); refCurrentState->name.value = L"currentState"; auto switchStat = MakePtr(); switchStat->expression = refCurrentState; whileBlock->statements.Add(switchStat); FOREACH(Ptr, state, node->states) { auto switchCase = MakePtr(); switchStat->caseBranches.Add(switchCase); auto refStateId = MakePtr(); refStateId->value.value = itow(smInfo->stateIds[state->name.value]); switchCase->expression = refStateId; auto caseBlock = MakePtr(); switchCase->statement = caseBlock; FOREACH(Ptr, argument, state->arguments) { auto refThis = MakePtr(); refThis->name.value = L"stateMachineObject"; auto refArgument = MakePtr(); refArgument->parent = refThis; refArgument->name.value = manager->stateDeclArguments[argument.Obj()]->GetName(); auto varDecl = MakePtr(); varDecl->name.value = argument->name.value; varDecl->expression = refArgument; auto varStat = MakePtr(); varStat->variable = varDecl; caseBlock->statements.Add(varStat); } caseBlock->statements.Add(ExpandStateMachineStatementVisitor(manager, smInfo.Obj()).CreateField(state->statement)); { auto gotoStat = MakePtr(); gotoStat->label.value = L"OUT_OF_STATE_MACHINE"; caseBlock->statements.Add(gotoStat); } SetCodeRange(Ptr(caseBlock), state->codeRange); } } } // finally {stateMachineCoroutine = previousCoroutine;} { auto refThis = MakePtr(); refThis->name.value = L"stateMachineObject"; auto refCoroutine = MakePtr(); refCoroutine->parent = refThis; refCoroutine->name.value = L"stateMachineCoroutine"; auto refPrevious = MakePtr(); refPrevious->name.value = L"previousCoroutine"; auto assignExpr = MakePtr(); assignExpr->op = WfBinaryOperator::Assign; assignExpr->first = refCoroutine; assignExpr->second = refPrevious; auto exprStat = MakePtr(); exprStat->expression = assignExpr; finallyBlock->statements.Add(exprStat); } } } } } } } } /*********************************************************************** .\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(); node->expandedStatement = block; auto varName = L"" + itow(manager->usedTempVars++); { auto result = manager->expressionResolvings[node->expression.Obj()]; auto decl = MakePtr(); decl->name.value = varName; decl->type = GetTypeFromTypeInfo(result.type.Obj()); decl->expression = CopyExpression(node->expression, true); auto stat = MakePtr(); stat->variable = decl; block->statements.Add(stat); } Ptr rootIfStat; auto tailIfStat = &rootIfStat; FOREACH(Ptr, switchCase, node->caseBranches) { auto ifStat = MakePtr(); *tailIfStat = ifStat; tailIfStat = &ifStat->falseBranch; { auto refExpr = MakePtr(); refExpr->name.value = varName; auto inferExpr = MakePtr(); inferExpr->expression= CopyExpression(switchCase->expression, true); { auto result = manager->expressionResolvings[switchCase->expression.Obj()]; inferExpr->type = GetTypeFromTypeInfo(result.type.Obj()); } auto compare = MakePtr(); compare->first = refExpr; compare->second = inferExpr; compare->op = WfBinaryOperator::EQ; ifStat->expression = compare; } ifStat->trueBranch = CopyStatement(switchCase->statement, true); } if (node->defaultBranch) { *tailIfStat = CopyStatement(node->defaultBranch, true); } if (rootIfStat) { block->statements.Add(rootIfStat); } } /*********************************************************************** ExpandForEachStatement ***********************************************************************/ Ptr GenerateForEachStepStatement(WfForEachStatement* node) { auto refVar1 = MakePtr(); refVar1->name.value = node->name.value; auto refVar2 = MakePtr(); refVar2->name.value = node->name.value; auto one = MakePtr(); one->value.value = L"1"; auto stepExpr = MakePtr(); stepExpr->first = refVar2; stepExpr->second = one; stepExpr->op = node->direction == WfForEachDirection::Normal ? WfBinaryOperator::Add : WfBinaryOperator::Sub; auto assignExpr = MakePtr(); assignExpr->first = refVar1; assignExpr->second = stepExpr; assignExpr->op = WfBinaryOperator::Assign; auto stat = MakePtr(); stat->expression = assignExpr; return stat; } class CopyForEachRangeBodyVisitor : public CopyWithExpandVirtualVisitor { public: WfLexicalScopeManager* manager; WfForEachStatement* forEach; CopyForEachRangeBodyVisitor(WfLexicalScopeManager* _manager, WfForEachStatement* _forEach) :CopyWithExpandVirtualVisitor(true) , manager(_manager) , forEach(_forEach) { } void Visit(WfContinueStatement* node) { auto scope = manager->nodeScopes[node]; while (scope) { if (scope->ownerNode.Cast()) { break; } else if (scope->ownerNode.Cast()) { if (scope->ownerNode != forEach) { break; } else { auto block = MakePtr(); block->statements.Add(GenerateForEachStepStatement(forEach)); block->statements.Add(MakePtr()); SetCodeRange((Ptr)block, node->codeRange); result = block; return; } } scope = scope->parentScope; } copy_visitor::StatementVisitor::Visit(node); } }; void ExpandForEachStatement(WfLexicalScopeManager* manager, WfForEachStatement* node) { auto block = MakePtr(); node->expandedStatement = block; if (auto range = node->collection.Cast()) { auto varBegin = L"" + node->name.value; auto varEnd = L"" + node->name.value; { auto result = manager->expressionResolvings[range->begin.Obj()]; auto decl = MakePtr(); decl->name.value = varBegin; decl->type = GetTypeFromTypeInfo(result.type.Obj()); decl->expression = CopyExpression(range->begin, true); if (range->beginBoundary == WfRangeBoundary::Exclusive) { auto one = MakePtr(); one->value.value = L"1"; auto addExpr = MakePtr(); addExpr->first = decl->expression; addExpr->second = one; addExpr->op = WfBinaryOperator::Add; decl->expression = addExpr; } auto stat = MakePtr(); stat->variable = decl; block->statements.Add(stat); } { auto result = manager->expressionResolvings[range->end.Obj()]; auto decl = MakePtr(); decl->name.value = varEnd; decl->type = GetTypeFromTypeInfo(result.type.Obj()); decl->expression = CopyExpression(range->end, true); if (range->endBoundary == WfRangeBoundary::Exclusive) { auto one = MakePtr(); one->value.value = L"1"; auto subExpr = MakePtr(); subExpr->first = decl->expression; subExpr->second = one; subExpr->op = WfBinaryOperator::Sub; decl->expression = subExpr; } auto stat = MakePtr(); stat->variable = decl; block->statements.Add(stat); } { auto refBegin = MakePtr(); refBegin->name.value = node->direction == WfForEachDirection::Normal ? varBegin : varEnd; auto decl = MakePtr(); decl->name.value = node->name.value; decl->expression = refBegin; auto stat = MakePtr(); stat->variable = decl; block->statements.Add(stat); } { auto whileStat = MakePtr(); { auto refVar = MakePtr(); refVar->name.value = node->name.value; auto refBegin = MakePtr(); refBegin->name.value = node->direction == WfForEachDirection::Normal ? varEnd : varBegin; auto compare = MakePtr(); compare->first = refVar; compare->second = refBegin; compare->op = node->direction == WfForEachDirection::Normal ? WfBinaryOperator::LE : WfBinaryOperator::GE; whileStat->condition = compare; } { auto whileBlock = MakePtr(); whileStat->statement = whileBlock; { CopyForEachRangeBodyVisitor visitor(manager, node); node->statement->Accept(&visitor); whileBlock->statements.Add(visitor.result.Cast()); } whileBlock->statements.Add(GenerateForEachStepStatement(node)); } block->statements.Add(whileStat); } } else { auto varEnum = L"" + node->name.value; auto varIter = L"" + node->name.value; { auto decl = MakePtr(); decl->name.value = varEnum; if (node->direction == WfForEachDirection::Normal) { auto inferExpr = MakePtr(); inferExpr->expression = CopyExpression(node->collection, true); inferExpr->type = GetTypeFromTypeInfo(TypeInfoRetriver>::CreateTypeInfo().Obj()); decl->expression = inferExpr; } else { auto refMethod = MakePtr(); refMethod->parent = GetExpressionFromTypeDescriptor(description::GetTypeDescriptor()); refMethod->name.value = L"ReverseEnumerable"; auto refCall = MakePtr(); refCall->function = refMethod; refCall->arguments.Add(CopyExpression(node->collection, true)); decl->expression = refCall; } auto stat = MakePtr(); stat->variable = decl; block->statements.Add(stat); } { auto refEnum = MakePtr(); refEnum->name.value = varEnum; auto refMethod = MakePtr(); refMethod->parent = refEnum; refMethod->name.value = L"CreateEnumerator"; auto callExpr = MakePtr(); callExpr->function = refMethod; auto decl = MakePtr(); decl->name.value = varIter; decl->expression = callExpr; auto stat = MakePtr(); stat->variable = decl; block->statements.Add(stat); } { auto whileStat = MakePtr(); { auto refIter = MakePtr(); refIter->name.value = varIter; auto refMethod = MakePtr(); refMethod->parent = refIter; refMethod->name.value = L"Next"; auto callExpr = MakePtr(); callExpr->function = refMethod; whileStat->condition = callExpr; } { auto whileBlock = MakePtr(); whileStat->statement = whileBlock; { auto refIter = MakePtr(); refIter->name.value = varIter; auto refMethod = MakePtr(); refMethod->parent = refIter; refMethod->name.value = L"GetCurrent"; auto callExpr = MakePtr(); callExpr->function = refMethod; auto castExpr = MakePtr(); 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(); decl->name.value = node->name.value; decl->expression = castExpr; auto stat = MakePtr(); stat->variable = decl; whileBlock->statements.Add(stat); } whileBlock->statements.Add(CopyStatement(node->statement, true)); } block->statements.Add(whileStat); } } } /*********************************************************************** ExpandCoProviderStatement ***********************************************************************/ class ExpandCoProviderStatementVisitor : public CopyWithExpandVirtualVisitor { public: WfLexicalScopeManager* manager; ExpandCoProviderStatementVisitor(WfLexicalScopeManager* _manager) :CopyWithExpandVirtualVisitor(true) , manager(_manager) { } void Visit(WfReturnStatement* node)override { auto opInfo = manager->coOperatorResolvings[node].methodInfo; auto block = MakePtr(); { auto refImpl = MakePtr(); refImpl->name.value = L""; auto funcExpr = MakePtr(); funcExpr->parent = GetExpressionFromTypeDescriptor(opInfo->GetOwnerTypeDescriptor()); funcExpr->name.value = opInfo->GetName(); auto callExpr = MakePtr(); callExpr->function = funcExpr; callExpr->arguments.Add(refImpl); if (node->expression) { auto returnValue = CreateField(node->expression); { auto scope = manager->nodeScopes[node].Obj(); auto functionScope = scope->FindFunctionScope(); if (auto funcDecl = functionScope->ownerNode.Cast()) { auto returnType = CreateTypeInfoFromType(scope, funcDecl->returnType); if (auto group = returnType->GetTypeDescriptor()->GetMethodGroupByName(L"StoreResult", true)) { vint count = group->GetMethodCount(); for (vint i = 0; i < count; i++) { auto method = group->GetMethod(i); if (method->IsStatic() && method->GetParameterCount() == 1) { auto refType = GetExpressionFromTypeDescriptor(returnType->GetTypeDescriptor()); auto refStoreResult = MakePtr(); refStoreResult->parent = refType; refStoreResult->name.value = L"StoreResult"; auto callExpr = MakePtr(); callExpr->function = refStoreResult; callExpr->arguments.Add(returnValue); returnValue = callExpr; break; } } } } } callExpr->arguments.Add(returnValue); } auto stat = MakePtr(); stat->expression = callExpr; block->statements.Add(stat); } block->statements.Add(MakePtr()); SetCodeRange(Ptr(block), node->codeRange); result = block; } void Visit(WfCoOperatorStatement* node)override { auto opInfo = manager->coOperatorResolvings[node].methodInfo; auto block = MakePtr(); { auto refImpl = MakePtr(); refImpl->name.value = L""; auto funcExpr = MakePtr(); funcExpr->parent = GetExpressionFromTypeDescriptor(opInfo->GetOwnerTypeDescriptor()); funcExpr->name.value = opInfo->GetName(); auto callExpr = MakePtr(); callExpr->function = funcExpr; callExpr->arguments.Add(refImpl); FOREACH(Ptr, argument, node->arguments) { callExpr->arguments.Add(CreateField(argument)); } auto stat = MakePtr(); stat->expression = callExpr; auto pauseBlock = MakePtr(); pauseBlock->statements.Add(stat); auto pauseStat = MakePtr(); pauseStat->statement = pauseBlock; block->statements.Add(pauseStat); } { Ptr ifHasResultStat; if (node->varName.value == L"") { ifHasResultStat = MakePtr(); { auto refCoResult = MakePtr(); refCoResult->name.value = L""; auto testExpr = MakePtr(); testExpr->expression = refCoResult; testExpr->test = WfTypeTesting::IsNotNull; ifHasResultStat->expression = testExpr; } } auto ifStat = MakePtr(); { auto refCoResult = MakePtr(); refCoResult->name.value = L""; auto refFailure = MakePtr(); refFailure->parent = refCoResult; refFailure->name.value = L"Failure"; auto testExpr = MakePtr(); testExpr->expression = refFailure; testExpr->test = WfTypeTesting::IsNotNull; ifStat->expression = testExpr; } { auto refCoResult = MakePtr(); refCoResult->name.value = L""; auto refFailure = MakePtr(); refFailure->parent = refCoResult; refFailure->name.value = L"Failure"; auto raiseStat = MakePtr(); raiseStat->expression = refFailure; auto ifBlock = MakePtr(); ifBlock->statements.Add(raiseStat); ifStat->trueBranch = ifBlock; } if (ifHasResultStat) { auto ifBlock = MakePtr(); ifHasResultStat->trueBranch = ifBlock; ifBlock->statements.Add(ifStat); block->statements.Add(ifHasResultStat); } else { block->statements.Add(ifStat); } } if (node->varName.value != L"") { auto refCoResult = MakePtr(); refCoResult->name.value = L""; auto refResult = MakePtr(); refResult->parent = refCoResult; refResult->name.value = L"Result"; auto castResultInfo = manager->coCastResultResolvings[node].methodInfo; auto refCastResult = MakePtr(); refCastResult->parent = GetExpressionFromTypeDescriptor(castResultInfo->GetOwnerTypeDescriptor()); refCastResult->name.value = L"CastResult"; auto callExpr = MakePtr(); callExpr->function = refCastResult; callExpr->arguments.Add(refResult); auto varDecl = MakePtr(); varDecl->name.value = node->varName.value; varDecl->expression = callExpr; auto stat = MakePtr(); stat->variable = varDecl; block->statements.Add(stat); } SetCodeRange(Ptr(block), node->codeRange); result = block; } void Visit(WfBlockStatement* node)override { auto block = MakePtr(); FOREACH(Ptr, statement, node->statements) { statement = SearchUntilNonVirtualStatement(statement); if (auto coOperatorStat = statement.Cast()) { coOperatorStat->Accept(this); CopyFrom(block->statements, result.Cast()->statements, true); } else { block->statements.Add(CreateField(statement)); } } SetCodeRange(Ptr(block), node->codeRange); result = block; } }; void ExpandCoProviderStatement(WfLexicalScopeManager* manager, WfCoProviderStatement* node) { auto scope = manager->nodeScopes[node].Obj(); auto functionScope = scope->FindFunctionScope(); auto funcDecl = functionScope->ownerNode.Cast(); 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(); { coroutineExpr->name.value = L""; coroutineExpr->statement = ExpandCoProviderStatementVisitor(manager).CreateField(node->statement); } manager->coNewCoroutineResolvings.Add(coroutineExpr, ResolveExpressionResult::ReadonlyType(providerType)); auto creatorExpr = MakePtr(); { auto creatorDecl = MakePtr(); creatorExpr->function = creatorDecl; creatorDecl->anonymity = WfFunctionAnonymity::Anonymous; creatorDecl->returnType = GetTypeFromTypeInfo(TypeInfoRetriver>::CreateTypeInfo().Obj()); { auto argument = MakePtr(); creatorDecl->arguments.Add(argument); argument->name.value = L""; argument->type = GetTypeFromTypeInfo(implType.Obj()); } auto block = MakePtr(); creatorDecl->statement = block; auto returnStat = MakePtr(); returnStat->expression = coroutineExpr; block->statements.Add(returnStat); } auto providerBlock = MakePtr(); { auto funcReturnType = CreateTypeInfoFromType(functionScope, funcDecl->returnType); auto creatorInfo = manager->coProviderResolvings[node].methodInfo; auto funcExpr = MakePtr(); funcExpr->parent = GetExpressionFromTypeDescriptor(creatorInfo->GetOwnerTypeDescriptor()); funcExpr->name.value = creatorInfo->GetName(); auto callExpr = MakePtr(); callExpr->function = funcExpr; callExpr->arguments.Add(creatorExpr); if (funcReturnType->GetTypeDescriptor() == description::GetTypeDescriptor()) { auto stat = MakePtr(); stat->expression = callExpr; providerBlock->statements.Add(stat); } else { if (IsSameType(funcReturnType.Obj(), creatorInfo->GetReturn())) { auto stat = MakePtr(); stat->expression = callExpr; providerBlock->statements.Add(stat); } else if (funcReturnType->GetTypeDescriptor() == creatorInfo->GetReturn()->GetTypeDescriptor()) { auto castExpr = MakePtr(); castExpr->strategy = WfTypeCastingStrategy::Strong; castExpr->type = GetTypeFromTypeInfo(funcReturnType.Obj()); castExpr->expression = callExpr; auto stat = MakePtr(); stat->expression = castExpr; providerBlock->statements.Add(stat); } else { { auto varDecl = MakePtr(); varDecl->name.value = L""; varDecl->expression = callExpr; auto stat = MakePtr(); stat->variable = varDecl; providerBlock->statements.Add(stat); } { auto refExpr = MakePtr(); refExpr->name.value = L""; auto castExpr = MakePtr(); castExpr->type = GetTypeFromTypeInfo(funcReturnType.Obj()); castExpr->expression = refExpr; auto stat = MakePtr(); 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::VirtualCseExpressionVisitor { public: WfLexicalScopeManager* manager; bool result = false; IsExpressionDependOnExpectedTypeVisitor(WfLexicalScopeManager* _manager) :manager(_manager) { } void Dispatch(WfVirtualCfeExpression* node)override { node->expandedExpression->Accept(this); } void Dispatch(WfVirtualCseExpression* node)override { node->Accept((WfVirtualCseExpression::IVisitor*)this); } bool Execute(Ptr expression) { result = false; expression->Accept(this); return result; } void Visit(WfReferenceExpression* node)override { auto scope = manager->nodeScopes[node].Obj(); List 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(WfBinaryExpression* node)override { if (node->op == WfBinaryOperator::FlagOr) { result = Execute(node->first) && Execute(node->second); } } 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, argument, node->arguments) { if (argument->value) { if (auto refExpr = argument->key.Cast()) { possibleFieldCount++; List testResults; manager->ResolveName(scope, refExpr->name.value, testResults); if (testResults.Count() == 0) { unresolvableField = true; } } } } result = unresolvableField&&possibleFieldCount == node->arguments.Count(); } } void Visit(WfExpectedTypeCastExpression* node)override { result = true; } }; bool IsExpressionDependOnExpectedType(WfLexicalScopeManager* manager, Ptr expression) { IsExpressionDependOnExpectedTypeVisitor visitor(manager); expression->Accept(&visitor); return visitor.result; } /*********************************************************************** GetExpressionName(Expression) ***********************************************************************/ class GetExpressionNameVisitor : public empty_visitor::ExpressionVisitor , public empty_visitor::VirtualCseExpressionVisitor { public: WString result; void Dispatch(WfVirtualCfeExpression* node)override { node->expandedExpression->Accept(this); } void Dispatch(WfVirtualCseExpression* node)override { node->Accept((WfVirtualCseExpression::IVisitor*)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 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& names; SearchOrderedNameVisitor(WfLexicalScope* _scope, SortedList& _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 expression, SortedList& names) { SearchOrderedNameVisitor visitor(scope, names); expression->Accept(&visitor); } }; void SearchOrderedName(WfLexicalScope* scope, Ptr expression, collections::SortedList& 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()) return TypeFlag::Bool; if (typeDescriptor == GetTypeDescriptor()) return TypeFlag::I1; if (typeDescriptor == GetTypeDescriptor()) return TypeFlag::I2; if (typeDescriptor == GetTypeDescriptor()) return TypeFlag::I4; if (typeDescriptor == GetTypeDescriptor()) return TypeFlag::I8; if (typeDescriptor == GetTypeDescriptor()) return TypeFlag::U1; if (typeDescriptor == GetTypeDescriptor()) return TypeFlag::U2; if (typeDescriptor == GetTypeDescriptor()) return TypeFlag::U4; if (typeDescriptor == GetTypeDescriptor()) return TypeFlag::U8; if (typeDescriptor == GetTypeDescriptor()) return TypeFlag::F4; if (typeDescriptor == GetTypeDescriptor()) return TypeFlag::F8; if (typeDescriptor == GetTypeDescriptor()) 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 CreateTypeInfoFromTypeFlag(TypeFlag flag) { switch (flag) { case TypeFlag::Bool: return TypeInfoRetriver::CreateTypeInfo(); case TypeFlag::I1: return TypeInfoRetriver::CreateTypeInfo(); case TypeFlag::I2: return TypeInfoRetriver::CreateTypeInfo(); case TypeFlag::I4: return TypeInfoRetriver::CreateTypeInfo(); case TypeFlag::I8: return TypeInfoRetriver::CreateTypeInfo(); case TypeFlag::U1: return TypeInfoRetriver::CreateTypeInfo(); case TypeFlag::U2: return TypeInfoRetriver::CreateTypeInfo(); case TypeFlag::U4: return TypeInfoRetriver::CreateTypeInfo(); case TypeFlag::U8: return TypeInfoRetriver::CreateTypeInfo(); case TypeFlag::F4: return TypeInfoRetriver::CreateTypeInfo(); case TypeFlag::F8: return TypeInfoRetriver::CreateTypeInfo(); case TypeFlag::String: return TypeInfoRetriver::CreateTypeInfo(); default: return nullptr; } } /*********************************************************************** GetTypeFragments ***********************************************************************/ void GetTypeFragments(reflection::description::ITypeDescriptor* typeDescriptor, collections::List& 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 GetExpressionFromTypeDescriptor(reflection::description::ITypeDescriptor* typeDescriptor) { List fragments; GetTypeFragments(typeDescriptor, fragments); Ptr parentExpr; FOREACH(WString, fragment, fragments) { if (!parentExpr) { auto expr = MakePtr(); expr->name.value = fragment; parentExpr = expr; } else { auto expr = MakePtr(); expr->parent = parentExpr; expr->name.value = fragment; parentExpr = expr; } } return parentExpr; } /*********************************************************************** GetTypeFromTypeInfo ***********************************************************************/ Ptr GetTypeFromTypeInfo(reflection::description::ITypeInfo* typeInfo) { switch (typeInfo->GetDecorator()) { case ITypeInfo::RawPtr: { Ptr element = GetTypeFromTypeInfo(typeInfo->GetElementType()); if (element) { Ptr 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 element = GetTypeFromTypeInfo(typeInfo->GetElementType()); if (element) { Ptr type = new WfSharedPointerType; type->element = element; return type; } return 0; } } case ITypeInfo::Nullable: { Ptr element = GetTypeFromTypeInfo(typeInfo->GetElementType()); if (element) { Ptr type = new WfNullableType; type->element = element; return type; } return 0; } case ITypeInfo::TypeDescriptor: { List fragments; GetTypeFragments(typeInfo->GetTypeDescriptor(), fragments); Ptr parentType; FOREACH(WString, fragment, fragments) { if (!parentType) { auto type = MakePtr(); type->name.value = fragment; parentType = type; } else { auto type = MakePtr(); type->parent = parentType; type->name.value = fragment; parentType = type; } } return parentType; } case ITypeInfo::Generic: { if (typeInfo->GetElementType()->GetDecorator() == ITypeInfo::TypeDescriptor) { if (typeInfo->GetTypeDescriptor() == GetTypeDescriptor()) { if (typeInfo->GetGenericArgumentCount() == 1) { if (Ptr elementType = GetTypeFromTypeInfo(typeInfo->GetGenericArgument(0))) { Ptr type = new WfEnumerableType; type->element = elementType; return type; } } } else if (typeInfo->GetTypeDescriptor() == GetTypeDescriptor()) { if (typeInfo->GetGenericArgumentCount() == 1) { if (Ptr valueType = GetTypeFromTypeInfo(typeInfo->GetGenericArgument(0))) { Ptr type = new WfMapType; type->writability = WfMapWritability::Readonly; type->value = valueType; return type; } } } else if (typeInfo->GetTypeDescriptor() == GetTypeDescriptor()) { if (typeInfo->GetGenericArgumentCount() == 1) { if (Ptr valueType = GetTypeFromTypeInfo(typeInfo->GetGenericArgument(0))) { Ptr type = new WfMapType; type->writability = WfMapWritability::Writable; type->value = valueType; return type; } } } else if (typeInfo->GetTypeDescriptor() == GetTypeDescriptor()) { if (typeInfo->GetGenericArgumentCount() == 1) { if (Ptr elementType = GetTypeFromTypeInfo(typeInfo->GetGenericArgument(0))) { Ptr type = new WfObservableListType; type->element = elementType; return type; } } } else if (typeInfo->GetTypeDescriptor() == GetTypeDescriptor()) { if (typeInfo->GetGenericArgumentCount() == 2) { if (Ptr keyType = GetTypeFromTypeInfo(typeInfo->GetGenericArgument(0))) if (Ptr valueType = GetTypeFromTypeInfo(typeInfo->GetGenericArgument(1))) { Ptr type = new WfMapType; type->writability = WfMapWritability::Readonly; type->key = keyType; type->value = valueType; return type; } } } else if (typeInfo->GetTypeDescriptor() == GetTypeDescriptor()) { if (typeInfo->GetGenericArgumentCount() == 2) { if (Ptr keyType = GetTypeFromTypeInfo(typeInfo->GetGenericArgument(0))) if (Ptr valueType = GetTypeFromTypeInfo(typeInfo->GetGenericArgument(1))) { Ptr type = new WfMapType; type->writability = WfMapWritability::Writable; type->key = keyType; type->value = valueType; return type; } } } else if (typeInfo->GetTypeDescriptor() == GetTypeDescriptor()) { if (typeInfo->GetGenericArgumentCount() >= 1) { if (Ptr returnType = GetTypeFromTypeInfo(typeInfo->GetGenericArgument(0))) { Ptr type = new WfFunctionType; type->result = GetTypeFromTypeInfo(typeInfo->GetGenericArgument(0)); for (vint i = 1; i < typeInfo->GetGenericArgumentCount(); i++) { if (Ptr 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 result; GetScopeNameFromReferenceTypeVisitor(WfLexicalScope* _scope) :scope(_scope) { } Ptr Call(WfType* node) { node->Accept(this); Ptr 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 ns = new WfTopQualifiedType; ns->name.value = L"system"; Ptr 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 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])); } } 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(WfObservableListType* node)override { CHECK_FAIL(L"GetScopeNameFromReferenceTypeVisitor::Visit(WfObservableListType*)#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 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 Execute(WfLexicalScope* scope, WfType* type) { return GetScopeNameFromReferenceTypeVisitor(scope).Call(type); } }; Ptr GetScopeNameFromReferenceType(WfLexicalScope* scope, Ptr type) { return GetScopeNameFromReferenceTypeVisitor::Execute(scope, type.Obj()); } /*********************************************************************** CreateTypeInfoFromType ***********************************************************************/ class CreateTypeInfoFromTypeVisitor : public Object, public WfType::IVisitor { public: WfLexicalScope* scope; Ptr result; CreateTypeInfoFromTypeVisitor(WfLexicalScope* _scope) :scope(_scope) { } Ptr Call(WfType* node, bool checkTypeForValue) { node->Accept(this); Ptr 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(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(); break; case WfPredefinedTypeName::Object: typeDescriptor = description::GetTypeDescriptor(); break; case WfPredefinedTypeName::Interface: typeDescriptor = description::GetTypeDescriptor(); break; case WfPredefinedTypeName::Int: typeDescriptor = description::GetTypeDescriptor(); break; case WfPredefinedTypeName::UInt: typeDescriptor = description::GetTypeDescriptor(); break; case WfPredefinedTypeName::Float: typeDescriptor = description::GetTypeDescriptor(); break; case WfPredefinedTypeName::Double: typeDescriptor = description::GetTypeDescriptor(); break; case WfPredefinedTypeName::String: typeDescriptor = description::GetTypeDescriptor(); break; case WfPredefinedTypeName::Char: typeDescriptor = description::GetTypeDescriptor(); break; case WfPredefinedTypeName::Bool: typeDescriptor = description::GetTypeDescriptor(); break; default: CHECK_FAIL(L"CreateTypeInfoFromTypeVisitor::Visit(WfPredefinedType*)#Internal error, ValidateTypeStructure function should check correctly."); } if (typeDescriptor) { result = MakePtr(typeDescriptor, TypeInfoHint::Normal); } } void Visit(WfTopQualifiedType* node)override { VisitReferenceType(node); } void Visit(WfReferenceType* node)override { VisitReferenceType(node); } void Visit(WfRawPointerType* node)override { if (Ptr element = Call(node->element.Obj(), false)) { result = MakePtr(element); } } void Visit(WfSharedPointerType* node)override { if (Ptr element = Call(node->element.Obj(), false)) { result = MakePtr(element); } } void Visit(WfNullableType* node)override { if (Ptr element = Call(node->element.Obj(), false)) { result = MakePtr(element); } } void Visit(WfEnumerableType* node)override { if (Ptr element = Call(node->element.Obj(), true)) { auto enumerableTypeInfo = MakePtr(description::GetTypeDescriptor(), TypeInfoHint::Normal); auto genericTypeInfo = MakePtr(enumerableTypeInfo); genericTypeInfo->AddGenericArgument(element); result = MakePtr(genericTypeInfo); } } void Visit(WfMapType* node)override { Ptr 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(); } else { typeDescriptor = description::GetTypeDescriptor(); } } else { if (node->key) { typeDescriptor = description::GetTypeDescriptor(); } else { typeDescriptor = description::GetTypeDescriptor(); } } auto mapTypeInfo = MakePtr(typeDescriptor, TypeInfoHint::Normal); auto genericTypeInfo = MakePtr(mapTypeInfo); if (key) genericTypeInfo->AddGenericArgument(key); genericTypeInfo->AddGenericArgument(value); result = MakePtr(genericTypeInfo); } void Visit(WfObservableListType* node)override { Ptr element; if (!(element = Call(node->element.Obj(), true))) return; auto typeDescriptor = description::GetTypeDescriptor(); auto mapTypeInfo = MakePtr(typeDescriptor, TypeInfoHint::Normal); auto genericTypeInfo = MakePtr(mapTypeInfo); genericTypeInfo->AddGenericArgument(element); result = MakePtr(genericTypeInfo); } void Visit(WfFunctionType* node)override { if (Ptr returnType = Call(node->result.Obj(), true)) { auto enumerableTypeInfo = MakePtr(description::GetTypeDescriptor(), TypeInfoHint::Normal); auto genericTypeInfo = MakePtr(enumerableTypeInfo); genericTypeInfo->AddGenericArgument(returnType); FOREACH(Ptr, argument, node->arguments) { if (Ptr argumentType = Call(argument.Obj(), true)) { genericTypeInfo->AddGenericArgument(argumentType); } else { return; } } result = MakePtr(genericTypeInfo); } } void Visit(WfChildType* node)override { VisitReferenceType(node); } static Ptr Execute(WfLexicalScope* scope, WfType* type, bool checkTypeForValue) { return CreateTypeInfoFromTypeVisitor(scope).Call(type, checkTypeForValue); } }; Ptr CreateTypeInfoFromType(WfLexicalScope* scope, Ptr type, bool checkTypeForValue) { return CreateTypeInfoFromTypeVisitor::Execute(scope, type.Obj(), checkTypeForValue); } /*********************************************************************** CreateTypeInfoFromType ***********************************************************************/ Ptr CopyTypeInfoInternal(reflection::description::ITypeInfo* typeInfo) { switch (typeInfo->GetDecorator()) { case ITypeInfo::RawPtr: return MakePtr(CopyTypeInfo(typeInfo->GetElementType())); case ITypeInfo::SharedPtr: return MakePtr(CopyTypeInfo(typeInfo->GetElementType())); case ITypeInfo::Nullable: return MakePtr(CopyTypeInfo(typeInfo->GetElementType())); case ITypeInfo::TypeDescriptor: return MakePtr(typeInfo->GetTypeDescriptor(), typeInfo->GetHint()); case ITypeInfo::Generic: { auto impl = MakePtr(typeInfo->GetElementType()); vint count = typeInfo->GetGenericArgumentCount(); for (vint i = 0; i < count; i++) { impl->AddGenericArgument(CopyTypeInfo(typeInfo->GetGenericArgument(i))); } return impl; } default:; return nullptr; } } Ptr CopyTypeInfo(reflection::description::ITypeInfo* typeInfo) { if (!typeInfo) return nullptr; return CopyTypeInfoInternal(typeInfo); } /*********************************************************************** CanConvertToType ***********************************************************************/ bool CanConvertToType(reflection::description::ITypeInfo* fromType, reflection::description::ITypeInfo* toType, bool explicitly) { ITypeDescriptor* objectType = GetTypeDescriptor(); 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()) { return explicitly && toTd->GetSerializableType() != nullptr; } else if (toTd == GetTypeDescriptor()) { 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 GetMergedType(Ptr firstType, Ptr 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(); case ITypeInfo::Generic: return false; } return false; } /*********************************************************************** CreateTypeInfoFromMethodInfo ***********************************************************************/ Ptr CreateTypeInfoFromMethodInfo(reflection::description::IMethodInfo* info) { auto elementType = MakePtr(description::GetTypeDescriptor(), TypeInfoHint::Normal); auto genericType = MakePtr(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(genericType); } } } } /*********************************************************************** .\ANALYZER\WFANALYZER_VALIDATESCOPENAME.CPP ***********************************************************************/ namespace vl { namespace workflow { namespace analyzer { /*********************************************************************** ValidateScopeName ***********************************************************************/ class ValidateScopeNameDeclarationVisitor : public Object , public WfDeclaration::IVisitor , public WfVirtualCseDeclaration::IVisitor { public: enum Category { None, Type, Variable, Function, Namespace, }; WfLexicalScopeManager* manager; Ptr name; Category category; ValidateScopeNameDeclarationVisitor(WfLexicalScopeManager* _manager, Ptr _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 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 { CHECK_FAIL(L"ValidateScopeNameDeclarationVisitor::Visit(WfEventDeclaration*)#Internal error, ValidateDeclarationStructure function should check correctly."); } void Visit(WfPropertyDeclaration* node)override { CHECK_FAIL(L"ValidateScopeNameDeclarationVisitor::Visit(WfPropertyDeclaration*)#Internal error, ValidateDeclarationStructure function should check correctly."); } void Visit(WfConstructorDeclaration* node)override { CHECK_FAIL(L"ValidateScopeNameDeclarationVisitor::Visit(WfConstructorDeclaration*)#Internal error, ValidateDeclarationStructure function should check correctly."); } void Visit(WfDestructorDeclaration* node)override { CHECK_FAIL(L"ValidateScopeNameDeclarationVisitor::Visit(WfDestructorDeclaration*)#Internal error, ValidateDeclarationStructure function should check correctly."); } 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(WfVirtualCfeDeclaration* node)override { FOREACH(Ptr, decl, node->expandedDeclarations) { decl->Accept(this); } } void Visit(WfVirtualCseDeclaration* node)override { node->Accept((WfVirtualCseDeclaration::IVisitor*)this); } void Visit(WfStateMachineDeclaration* node)override { CHECK_FAIL(L"ValidateScopeNameDeclarationVisitor::Visit(WfStateMachineDeclaration*)#Internal error, ValidateDeclarationStructure function should check correctly."); } }; void ValidateScopeName(WfLexicalScopeManager* manager, Ptr name) { ValidateScopeNameDeclarationVisitor visitor(manager, name); FOREACH(Ptr, declaration, name->declarations) { declaration->Accept(&visitor); } FOREACH(Ptr, child, name->children.Values()) { ValidateScopeName(manager, child); } } } } } /*********************************************************************** .\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(); 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 SelectFunction(WfLexicalScopeManager* manager, parsing::ParsingTreeCustomBase* node, Ptr functionExpression, List& functions, List>& arguments, vint& selectedFunctionIndex) { selectedFunctionIndex = -1; List resolvables; List> types; FOREACH(Ptr, argument, arguments) { if (!argument || IsExpressionDependOnExpectedType(manager, argument)) { resolvables.Add(false); types.Add(nullptr); } else { resolvables.Add(true); types.Add(GetExpressionType(manager, argument, nullptr)); } } List> functionErrors, nonFunctionErrors; List> selectedFunctionIndices; ITypeDescriptor* functionFd = description::GetTypeDescriptor(); for (vint i = 0; i < functions.Count(); i++) { bool failed = false; vint convertCount = 0; 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)) { if (!IsSameType(types[j].Obj(), argumentType)) { convertCount++; } } else { functionErrors.Add(WfErrors::FunctionArgumentTypeMismatched(node, result, j + 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,convertCount }); } } if (selectedFunctionIndices.Count() > 1) { vint minScore = From(selectedFunctionIndices) .Select([](Pair p) { return p.value; }) .Min(); for (vint i = selectedFunctionIndices.Count() - 1; i >= 0; i--) { if (selectedFunctionIndices[i].value != minScore) { selectedFunctionIndices.RemoveAt(i); } } } if (selectedFunctionIndices.Count() == 1) { selectedFunctionIndex = selectedFunctionIndices[0].key; ITypeInfo* genericType = GetFunctionType(functions[selectedFunctionIndex])->GetElementType(); for (vint i = 0; i < types.Count(); i++) { ITypeInfo* argumentType = genericType->GetGenericArgument(i + 1); if (resolvables[i]) { vint index = manager->expressionResolvings.Keys().IndexOf(arguments[i].Obj()); if (index != -1) { auto resolvingResult = manager->expressionResolvings.Values()[index]; CHECK_ERROR(resolvingResult.expectedType == nullptr, L"GetExpressionType should not set expectedType if it is null"); resolvingResult.expectedType = CopyTypeInfo(argumentType); manager->expressionResolvings.Set(arguments[i].Obj(), resolvingResult); } } else { if (arguments[i]) { GetExpressionType(manager, arguments[i], CopyTypeInfo(argumentType)); } } } return CopyTypeInfo(genericType->GetGenericArgument(0)); } else { if (selectedFunctionIndices.Count() > 1) { List overloadedFunctions; CopyFrom( overloadedFunctions, From(selectedFunctionIndices) .Select([&functions](Pair p) { return functions[p.key]; })); 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 ***********************************************************************/ void ValidateModuleSemantic(WfLexicalScopeManager* manager, Ptr module) { FOREACH(Ptr, declaration, module->declarations) { ValidateDeclarationSemantic(manager, declaration); } } /*********************************************************************** GetExpressionScopeName ***********************************************************************/ Ptr GetExpressionScopeName(WfLexicalScopeManager* manager, Ptr expression) { List 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 expression) { List 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 ***********************************************************************/ void GetExpressionTypes(WfLexicalScopeManager* manager, Ptr expression, Ptr expectedType, bool allowEvent, collections::List& results) { ValidateExpressionSemantic(manager, expression, expectedType, results); if (results.Count() == 0) return; Ptr 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> 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, type, failedTypes) { manager->errors.Add(WfErrors::ExpressionCannotImplicitlyConvertToType(expression.Obj(), type.Obj(), expectedType.Obj())); } } } } /*********************************************************************** GetExpressionType ***********************************************************************/ Ptr GetExpressionType(WfLexicalScopeManager* manager, Ptr expression, Ptr expectedType) { List 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; } } /*********************************************************************** GetLeftValueExpressionType ***********************************************************************/ Ptr GetLeftValueExpressionType(WfLexicalScopeManager* manager, Ptr expression) { List 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 nullptr; } /*********************************************************************** GetEnumerableExpressionItemType ***********************************************************************/ Ptr GetEnumerableExpressionItemType(WfLexicalScopeManager* manager, Ptr expression, Ptr expectedType) { Ptr collectionType = GetExpressionType(manager, expression, expectedType); if (collectionType) { if (collectionType->GetTypeDescriptor()->CanConvertTo(description::GetTypeDescriptor())) { if (collectionType->GetDecorator() == ITypeInfo::SharedPtr) { ITypeInfo* genericType = collectionType->GetElementType(); if (genericType->GetDecorator() == ITypeInfo::Generic && genericType->GetGenericArgumentCount() == 1) { return CopyTypeInfo(genericType->GetGenericArgument(0)); } } return TypeInfoRetriver::CreateTypeInfo(); } manager->errors.Add(WfErrors::ExpressionIsNotCollection(expression.Obj(), collectionType.Obj())); } return nullptr; } } } } /*********************************************************************** .\ANALYZER\WFANALYZER_VALIDATESEMANTIC_DECLARATION.CPP ***********************************************************************/ namespace vl { namespace workflow { namespace analyzer { using namespace collections; using namespace reflection; using namespace reflection::description; using namespace typeimpl; /*********************************************************************** ValidateSemantic(ClassMember) ***********************************************************************/ class ValidateSemanticClassMemberVisitor : public Object , public WfDeclaration::IVisitor { public: WfLexicalScopeManager* manager; Ptr td; Ptr classDecl; ValidateSemanticClassMemberVisitor(Ptr _td, Ptr _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() || 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>& arguments) { List 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(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 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, 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> arguments; SelectConstructor(manager, node, node, td, arguments); } } while (++index < baseTypes.Count()) { auto td = baseTypes[index]; List> 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(WfVirtualCfeDeclaration* node)override { ValidateDeclarationSemantic(manager, node); } void Visit(WfVirtualCseDeclaration* node)override { ValidateDeclarationSemantic(manager, node); } static void Execute(Ptr td, Ptr classDecl, Ptr memberDecl, WfLexicalScopeManager* manager) { ValidateSemanticClassMemberVisitor visitor(td, classDecl, manager); memberDecl->Accept(&visitor); } }; /*********************************************************************** ValidateSemantic(Declaration) ***********************************************************************/ class ExpandVirtualDeclarationVisitor : public Object, public WfVirtualCseDeclaration::IVisitor { public: WfLexicalScopeManager* manager; ExpandVirtualDeclarationVisitor(WfLexicalScopeManager* _manager) :manager(_manager) { } void Visit(WfStateMachineDeclaration* node)override { ExpandStateMachine(manager, node); } }; class ValidateSemanticDeclarationVisitor : public Object , public WfDeclaration::IVisitor , public WfVirtualCseDeclaration::IVisitor { public: WfLexicalScopeManager* manager; ValidateSemanticDeclarationVisitor(WfLexicalScopeManager* _manager) :manager(_manager) { } void Visit(List>& attributes) { FOREACH(Ptr, attribute, attributes) { auto key = Pair(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()) { manager->errors.Add(WfErrors::AttributeMissValue(attribute.Obj())); } } } } void Visit(WfNamespaceDeclaration* node)override { FOREACH(Ptr, declaration, node->declarations) { ValidateDeclarationSemantic(manager, declaration); } } void Visit(WfFunctionDeclaration* node)override { if (node->statement) { ValidateStatementSemantic(manager, node->statement); } FOREACH(Ptr, 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(); if (node->kind == WfClassKind::Interface) { FOREACH(Ptr, 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)); } } } if (auto sm = From(node->declarations) .FindType() .First(nullptr) ) { auto smtd = description::GetTypeDescriptor(); vint count = td->GetBaseTypeDescriptorCount(); auto smbc = Range(0, count) .Select([=](vint index) {return td->GetBaseTypeDescriptor(index); }) .Where([=](ITypeDescriptor* td) {return td == smtd; }) .First(nullptr); if (!smbc) { manager->errors.Add(WfErrors::StateMachineClassNotInheritFromStateMachine(node)); } } FOREACH(Ptr, memberDecl, node->declarations) { ValidateClassMemberSemantic(manager, td, node, memberDecl); } } void Visit(WfEnumDeclaration* node)override { FOREACH(Ptr, item, node->items) { Visit(item->attributes); } } void Visit(WfStructDeclaration* node)override { auto scope = manager->nodeScopes[node]; auto td = manager->declarationTypes[node].Cast(); FOREACH(Ptr, 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)); } } FOREACH(Ptr, member, node->members) { Visit(member->attributes); } } void Visit(WfVirtualCfeDeclaration* node)override { FOREACH(Ptr, decl, node->expandedDeclarations) { ValidateDeclarationSemantic(manager, decl); } } void Visit(WfVirtualCseDeclaration* node)override { bool expanded = node->expandedDeclarations.Count() > 0; vint errorCount = manager->errors.Count(); node->Accept((WfVirtualCseDeclaration::IVisitor*)this); if (!expanded && manager->errors.Count() == errorCount) { ExpandVirtualDeclarationVisitor visitor(manager); node->Accept(&visitor); FOREACH(Ptr, decl, node->expandedDeclarations) { SetCodeRange(decl, node->codeRange); } auto parentScope = manager->nodeScopes[node]; if (parentScope->ownerNode == node) { parentScope = parentScope->parentScope; } FOREACH(Ptr, decl, node->expandedDeclarations) { ContextFreeDeclarationDesugar(manager, decl); } FOREACH(Ptr, decl, node->expandedDeclarations) { BuildScopeForDeclaration(manager, parentScope, decl, manager->declaractionScopeSources[node]); } manager->checkedScopes_DuplicatedSymbol.Remove(parentScope.Obj()); manager->checkedScopes_SymbolType.Remove(parentScope.Obj()); if (!CheckScopes_DuplicatedSymbol(manager) || !CheckScopes_SymbolType(manager)) { return; } } FOREACH(Ptr, decl, node->expandedDeclarations) { ValidateDeclarationSemantic(manager, decl); } } void Visit(WfStateMachineDeclaration* node)override { bool foundDefaultState = false; FOREACH(Ptr, state, node->states) { if (state->name.value == L"") { foundDefaultState = true; } ValidateStatementSemantic(manager, state->statement); } if (!foundDefaultState) { manager->errors.Add(WfErrors::MissingDefaultState(node)); } } static void Execute(Ptr declaration, WfLexicalScopeManager* manager) { ValidateSemanticDeclarationVisitor visitor(manager); declaration->Accept(&visitor); visitor.Visit(declaration->attributes); } }; /*********************************************************************** ValidateSemantic ***********************************************************************/ void ValidateClassMemberSemantic(WfLexicalScopeManager* manager, Ptr td, Ptr classDecl, Ptr memberDecl) { return ValidateSemanticClassMemberVisitor::Execute(td, classDecl, memberDecl, manager); } void ValidateDeclarationSemantic(WfLexicalScopeManager* manager, Ptr declaration) { return ValidateSemanticDeclarationVisitor::Execute(declaration, manager); } } } } /*********************************************************************** .\ANALYZER\WFANALYZER_VALIDATESEMANTIC_EXPRESSION.CPP ***********************************************************************/ namespace vl { namespace workflow { namespace analyzer { using namespace collections; using namespace reflection; using namespace reflection::description; using namespace typeimpl; /*********************************************************************** ValidateSemantic(Expression) ***********************************************************************/ class ExpandVirtualExpressionVisitor : public Object, public WfVirtualCseExpression::IVisitor { public: WfLexicalScopeManager* manager; Ptr expectedType; ExpandVirtualExpressionVisitor(WfLexicalScopeManager* _manager, Ptr _expectedType) :manager(_manager) , expectedType(_expectedType) { } void Visit(WfBindExpression* node)override { ExpandBindExpression(manager, node); } void Visit(WfNewCoroutineExpression* node)override { ExpandNewCoroutineExpression(manager, node); } void Visit(WfMixinCastExpression* node)override { ExpandMixinCastExpression(manager, node); } void Visit(WfExpectedTypeCastExpression* node)override { auto castExpr = MakePtr(); castExpr->strategy = node->strategy; castExpr->expression = CopyExpression(node->expression, true); castExpr->type = GetTypeFromTypeInfo(expectedType.Obj()); node->expandedExpression = castExpr; } void Visit(WfCoOperatorExpression* node)override { auto scope = manager->nodeScopes[node].Obj(); auto functionScope = scope->FindFunctionScope(); if (functionScope->ownerNode.Cast()) { // variable is created after $coroutine{} is generated // so the expanding is delayed until $coroutine{} is ready ExpandCoOperatorExpression(manager, node); } } }; class ValidateSemanticExpressionVisitor : public Object , public WfExpression::IVisitor , public WfVirtualCseExpression::IVisitor { public: WfLexicalScopeManager* manager; Ptr expectedType; List& results; ValidateSemanticExpressionVisitor(WfLexicalScopeManager* _manager, Ptr _expectedType, List& _results) :manager(_manager) , expectedType(_expectedType) , results(_results) { } void Visit(WfThisExpression* node)override { auto scope = manager->nodeScopes[node].Obj(); Ptr 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(scope->typeOfThisExpr, TypeInfoHint::Normal); auto pointerType = MakePtr(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 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() || result.symbol->creatorNode.Cast()) { bool readonlyCaptured = false; if (!result.symbol->ownerScope->ownerNode.Cast() && !result.symbol->ownerScope->ownerNode.Cast()) { 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()) { 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()) { 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(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() && currentScope->typeOfThisExpr == result.propertyInfo->GetOwnerTypeDescriptor()) { if (firstConfigScope) { bool inMethodBody = lastConfigScope->GetOwnerClassMember() && lastConfigScope->ownerNode.Cast(); bool inDtorBody = lastConfigScope->ownerNode.Cast(); bool inCtorBody = lastConfigScope->parentScope->ownerNode.Cast(); bool inStateBody = lastConfigScope->ownerNode.Cast(); if (!inMethodBody && !inDtorBody && !inCtorBody && !inStateBody) { manager->errors.Add(WfErrors::FieldCannotInitializeUsingEachOther(node, result)); } } else if (!scope->ownerNode.Cast()) { 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 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> parameterSymbols; CopyFrom( parameterSymbols, Range(0, scope->symbols.Count()) .Select([scope](vint index)->Ptr{return scope->symbols.GetByIndex(index)[0];}) .OrderBy([](Ptr a, Ptr 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 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()) { goto ORDERED_FAILED; } } if (type->GetGenericArgumentCount() != parameterSymbols.Count() + 1) { goto ORDERED_FAILED; } Ptr resultType = type->GetGenericArgument(0); FOREACH_INDEXER(Ptr, 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(description::GetTypeDescriptor(), TypeInfoHint::Normal); auto genericType = MakePtr(funcType); genericType->AddGenericArgument(bodyType); resultType = MakePtr(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 type = GetExpressionType(manager, node->parent, 0); if (type) { SortedList 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 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 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::CreateTypeInfo())); } } void Visit(WfFloatingExpression* node)override { auto typeDescriptor = expectedType ? expectedType->GetTypeDescriptor() : nullptr; if (!typeDescriptor || typeDescriptor->GetTypeDescriptorFlags() == TypeDescriptorFlags::Object || typeDescriptor == description::GetTypeDescriptor()) { typeDescriptor = description::GetTypeDescriptor(); } if (auto serializableType = typeDescriptor->GetSerializableType()) { Value output; if (serializableType->Deserialize(node->value.value, output)) { results.Add(ResolveExpressionResult::ReadonlyType(MakePtr(typeDescriptor, TypeInfoHint::Normal))); return; } } manager->errors.Add(WfErrors::FloatingLiteralOutOfRange(node)); } void Visit(WfIntegerExpression* node)override { auto typeDescriptor = expectedType ? expectedType->GetTypeDescriptor() : nullptr; if (!typeDescriptor || typeDescriptor->GetTypeDescriptorFlags() == TypeDescriptorFlags::Object || typeDescriptor==description::GetTypeDescriptor()) { #ifdef VCZH_64 typeDescriptor = description::GetTypeDescriptor(); #else typeDescriptor = description::GetTypeDescriptor(); #endif } if (auto serializableType = typeDescriptor->GetSerializableType()) { Value output; if (serializableType->Deserialize(node->value.value, output)) { results.Add(ResolveExpressionResult::ReadonlyType(MakePtr(typeDescriptor, TypeInfoHint::Normal))); return; } } manager->errors.Add(WfErrors::IntegerLiteralOutOfRange(node)); } void Visit(WfStringExpression* node)override { results.Add(ResolveExpressionResult::ReadonlyType(TypeInfoRetriver::CreateTypeInfo())); } void Visit(WfUnaryExpression* node)override { Ptr 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 variableType = GetLeftValueExpressionType(manager, node->first); GetExpressionType(manager, node->second, variableType); if (variableType) { results.Add(ResolveExpressionResult::ReadonlyType(variableType)); } } else if (node->op == WfBinaryOperator::Index) { Ptr containerType = GetExpressionType(manager, node->first, 0); if (containerType) { if (containerType->GetDecorator() == ITypeInfo::SharedPtr) { ITypeInfo* genericType = containerType->GetElementType(); Ptr indexType; Ptr resultType; bool leftValue = false; if (genericType->GetDecorator() == ITypeInfo::Generic) { ITypeInfo* classType = genericType->GetElementType(); if (classType->GetTypeDescriptor() == description::GetTypeDescriptor()) { indexType = TypeInfoRetriver::CreateTypeInfo(); resultType = CopyTypeInfo(genericType->GetGenericArgument(0)); } else if (classType->GetTypeDescriptor() == description::GetTypeDescriptor()) { indexType = TypeInfoRetriver::CreateTypeInfo(); resultType = CopyTypeInfo(genericType->GetGenericArgument(0)); leftValue = true; } else if (classType->GetTypeDescriptor() == description::GetTypeDescriptor()) { indexType = TypeInfoRetriver::CreateTypeInfo(); resultType = CopyTypeInfo(genericType->GetGenericArgument(0)); leftValue = true; } else if (classType->GetTypeDescriptor() == description::GetTypeDescriptor()) { indexType = CopyTypeInfo(genericType->GetGenericArgument(0)); resultType = CopyTypeInfo(genericType->GetGenericArgument(1)); } else if (classType->GetTypeDescriptor() == description::GetTypeDescriptor()) { 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()) { indexType = TypeInfoRetriver::CreateTypeInfo(); resultType = TypeInfoRetriver::CreateTypeInfo(); } else if (genericType->GetTypeDescriptor() == description::GetTypeDescriptor()) { indexType = TypeInfoRetriver::CreateTypeInfo(); resultType = TypeInfoRetriver::CreateTypeInfo(); leftValue = true; } else if (genericType->GetTypeDescriptor() == description::GetTypeDescriptor()) { indexType = TypeInfoRetriver::CreateTypeInfo(); resultType = TypeInfoRetriver::CreateTypeInfo(); leftValue = true; } else if (genericType->GetTypeDescriptor() == description::GetTypeDescriptor()) { indexType = TypeInfoRetriver::CreateTypeInfo(); resultType = TypeInfoRetriver::CreateTypeInfo(); } else if (genericType->GetTypeDescriptor() == description::GetTypeDescriptor()) { indexType = TypeInfoRetriver::CreateTypeInfo(); resultType = TypeInfoRetriver::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::FlagAnd) { auto typeA = GetExpressionType(manager, node->first, expectedType); auto typeB = GetExpressionType(manager, node->second, expectedType); if (typeA && typeB) { if (typeA->GetDecorator() == ITypeInfo::TypeDescriptor && typeB->GetDecorator() == ITypeInfo::TypeDescriptor) { auto stringType = TypeInfoRetriver::CreateTypeInfo(); if (CanConvertToType(typeA.Obj(), stringType.Obj(), false) && CanConvertToType(typeB.Obj(), stringType.Obj(), false)) { results.Add(ResolveExpressionResult::ReadonlyType(stringType)); return; } 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)); return; } } manager->errors.Add(WfErrors::CannotMergeTwoType(node, typeA.Obj(), typeB.Obj())); } } else if (node->op == WfBinaryOperator::FlagOr) { auto typeA = GetExpressionType(manager, node->first, expectedType); auto typeB = GetExpressionType(manager, node->second, expectedType); if (typeA && typeB) { if (typeA->GetDecorator() == ITypeInfo::TypeDescriptor && typeB->GetDecorator() == ITypeInfo::TypeDescriptor) { 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)); return; } } manager->errors.Add(WfErrors::CannotMergeTwoType(node, typeA.Obj(), typeB.Obj())); } } else if (node->op == WfBinaryOperator::FailedThen) { Ptr firstType = GetExpressionType(manager, node->first, 0); bool depend = IsExpressionDependOnExpectedType(manager, node->second); Ptr secondType = GetExpressionType(manager, node->second, (depend ? firstType : nullptr)); 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())); } } } else { Ptr firstType = GetExpressionType(manager, node->first, 0); Ptr secondType = GetExpressionType(manager, node->second, 0); Ptr 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::I4, /*I2 */TypeFlag::I4, /*I4 */TypeFlag::I4, /*I8 */TypeFlag::I8, /*U1 */TypeFlag::U4, /*U2 */TypeFlag::U4, /*U4 */TypeFlag::U4, /*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::I4, /*I2 */TypeFlag::I4, /*I4 */TypeFlag::I4, /*I8 */TypeFlag::I8, /*U1 */TypeFlag::U4, /*U2 */TypeFlag::U4, /*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; 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::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, 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 type = GetExpressionType(manager, node->expression, expectedType); if (type) { results.Add(ResolveExpressionResult::ReadonlyType(type)); } } void Visit(WfIfExpression* node)override { Ptr boolType = TypeInfoRetriver::CreateTypeInfo(); GetExpressionType(manager, node->condition, boolType); Ptr 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 firstType = GetExpressionType(manager, node->begin, 0); Ptr secondType = GetExpressionType(manager, node->end, 0); Ptr 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(description::GetTypeDescriptor(), TypeInfoHint::Normal); auto genericType = MakePtr(enumerableType); genericType->AddGenericArgument(elementType); auto pointerType = MakePtr(genericType); results.Add(ResolveExpressionResult::ReadonlyType(pointerType)); } } void Visit(WfSetTestingExpression* node)override { Ptr elementType = GetExpressionType(manager, node->element, 0); if (auto range = node->collection.Cast()) { Ptr beginType = GetExpressionType(manager, range->begin, 0); Ptr 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 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::CreateTypeInfo())); } void Visit(WfConstructorExpression* node)override { if (expectedType && expectedType->GetTypeDescriptor()->GetTypeDescriptorFlags() == TypeDescriptorFlags::Struct) { SortedList fields; FOREACH(Ptr, argument, node->arguments) { if (!argument->value) { manager->errors.Add(WfErrors::ConstructorMixStructAndList(node)); return; } else if (auto field = argument->key.Cast()) { 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()) && !td->CanConvertTo(description::GetTypeDescriptor())) { manager->errors.Add(WfErrors::ConstructorCannotImplicitlyConvertToType(node, expectedType.Obj())); } results.Add(ResolveExpressionResult::ReadonlyType(expectedType)); } else { manager->errors.Add(WfErrors::ConstructorCannotResolveType(node)); } } else { ITypeInfo* expectedKeyType = nullptr; ITypeInfo* expectedValueType = nullptr; if (expectedType) { if (expectedType->GetDecorator() == ITypeInfo::SharedPtr) { auto genericType = expectedType->GetElementType(); if (genericType->GetDecorator() == ITypeInfo::Generic) { if (genericType->GetTypeDescriptor() == description::GetTypeDescriptor() || genericType->GetTypeDescriptor() == description::GetTypeDescriptor()) { if (genericType->GetGenericArgumentCount() == 2) { expectedKeyType = genericType->GetGenericArgument(0); expectedValueType = genericType->GetGenericArgument(1); } } else if (genericType->GetTypeDescriptor() == description::GetTypeDescriptor() || genericType->GetTypeDescriptor() == description::GetTypeDescriptor() || genericType->GetTypeDescriptor() == description::GetTypeDescriptor() || genericType->GetTypeDescriptor() == description::GetTypeDescriptor()) { if (genericType->GetGenericArgumentCount() == 1) { expectedKeyType = genericType->GetGenericArgument(0); } } } } } bool map = node->arguments[0]->value; Ptr keyType, valueType; FOREACH(Ptr, argument, node->arguments) { { Ptr newKeyType = GetExpressionType(manager, argument->key, expectedKeyType); 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 newValueType = GetExpressionType(manager, argument->value, expectedValueType); 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(description::GetTypeDescriptor(), TypeInfoHint::Normal); auto genericType = MakePtr(classType); genericType->AddGenericArgument(keyType); genericType->AddGenericArgument(valueType); auto pointerType = MakePtr(genericType); results.Add(ResolveExpressionResult::ReadonlyType(pointerType)); } } else { if (keyType) { Ptr classType; if (expectedType && expectedType->GetTypeDescriptor()==description::GetTypeDescriptor()) { classType = MakePtr(description::GetTypeDescriptor(), TypeInfoHint::Normal); } else { classType = MakePtr(description::GetTypeDescriptor(), TypeInfoHint::Normal); } auto genericType = MakePtr(classType); genericType->AddGenericArgument(keyType); auto pointerType = MakePtr(genericType); results.Add(ResolveExpressionResult::ReadonlyType(pointerType)); } } } } void Visit(WfInferExpression* node)override { auto scope = manager->nodeScopes[node].Obj(); Ptr type = CreateTypeInfoFromType(scope, node->type); Ptr 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 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::CreateTypeInfo())); } void Visit(WfTypeOfTypeExpression* node)override { results.Add(ResolveExpressionResult::ReadonlyType(TypeInfoRetriver::CreateTypeInfo())); } void Visit(WfTypeOfExpressionExpression* node)override { GetExpressionType(manager, node->expression, 0); results.Add(ResolveExpressionResult::ReadonlyType(TypeInfoRetriver::CreateTypeInfo())); } void Visit(WfAttachEventExpression* node)override { IEventInfo* eventInfo = GetExpressionEventInfo(manager, node->event); Ptr functionType; if (eventInfo) { functionType = CopyTypeInfo(eventInfo->GetHandlerType()); } GetExpressionType(manager, node->function, functionType); results.Add(ResolveExpressionResult::ReadonlyType(TypeInfoRetriver>::CreateTypeInfo())); } void Visit(WfDetachEventExpression* node)override { GetExpressionEventInfo(manager, node->event); Ptr pointerType = TypeInfoRetriver>::CreateTypeInfo(); GetExpressionType(manager, node->handler, pointerType); results.Add(ResolveExpressionResult::ReadonlyType(TypeInfoRetriver::CreateTypeInfo())); } void Visit(WfObserveExpression* node)override { Ptr parentType = GetExpressionType(manager, node->parent, 0); Ptr observeeType; if (parentType) { if (node->observeType == WfObserveType::SimpleObserve) { ITypeDescriptor* td = parentType->GetTypeDescriptor(); IPropertyInfo* propertyInfo = 0; { auto ref = node->expression.Cast(); propertyInfo = td->GetPropertyByName(ref->name.value, true); if (propertyInfo) { observeeType = CopyTypeInfo(propertyInfo->GetReturn()); manager->expressionResolvings.Add(node->expression, ResolveExpressionResult::Property(propertyInfo)); } 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, eventExpr, node->events) { auto ref = eventExpr.Cast(); IEventInfo* info = td->GetEventByName(ref->name.value, true); if (info) { manager->expressionResolvings.Add(eventExpr, ResolveExpressionResult::Event(info)); } else 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, eventExpr, node->events) { GetExpressionEventInfo(manager, eventExpr); } } } if (observeeType) { results.Add(ResolveExpressionResult::ReadonlyType(observeeType)); } } void Visit(WfCallExpression* node)override { List functions; GetExpressionTypes(manager, node->function, nullptr, true, functions); vint selectedFunctionIndex = -1; Ptr 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(description::GetTypeDescriptor(), TypeInfoHint::Normal); auto genericType = MakePtr(classType); genericType->AddGenericArgument(CreateTypeInfoFromType(scope, node->function->returnType)); FOREACH(Ptr, argument, node->function->arguments) { genericType->AddGenericArgument(scope->symbols[argument->name.value][0]->typeInfo); } auto pointerType = MakePtr(genericType); results.Add(ResolveExpressionResult::ReadonlyType(pointerType)); } Ptr GetFunctionDeclarationType(WfLexicalScope* scope, Ptr decl) { Ptr symbol = From(manager->nodeScopes[decl.Obj()]->parentScope->symbols[decl->name.value]) .Where([decl](Ptr symbol) { return symbol->creatorNode == decl; }) .First(); return symbol->typeInfo; } class NewInterfaceExpressionVisitor : public empty_visitor::DeclarationVisitor { public: WfLexicalScopeManager* manager; List> overrideFunctions; List> variableSymbols; WfFunctionDeclaration* lastFunction = nullptr; NewInterfaceExpressionVisitor(WfLexicalScopeManager* _manager) :manager(_manager) { } void Dispatch(WfVirtualCfeDeclaration* node)override { FOREACH(Ptr, decl, node->expandedDeclarations) { decl->Accept(this); } } void Dispatch(WfVirtualCseDeclaration* node)override { CHECK_FAIL(L"NewInterfaceExpressionVisitor::Visit(WfVirtualCseDeclaration*)#Internal error, Temporary not supported."); } 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 symbol) { return symbol->creatorNode == node; }) .First() ); } void Execute(WfNewInterfaceExpression* node) { FOREACH(Ptr, memberDecl, node->declarations) { memberDecl->Accept(this); ValidateDeclarationSemantic(manager, memberDecl); } } }; void Visit(WfNewClassExpression* node)override { auto scope = manager->nodeScopes[node].Obj(); Ptr type = CreateTypeInfoFromType(scope, node->type); if (type) { ITypeDescriptor* td = type->GetTypeDescriptor(); IMethodGroupInfo* ctors = td->GetConstructorGroup(); Ptr 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 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 type = CreateTypeInfoFromType(scope, node->type); if (type) { ITypeDescriptor* td = type->GetTypeDescriptor(); IMethodGroupInfo* ctors = td->GetConstructorGroup(); Ptr 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 interfaceMethods; Group> implementMethods; { NewInterfaceExpressionVisitor declVisitor(manager); declVisitor.Execute(node); if (declVisitor.lastFunction) { FOREACH(Ptr, func, declVisitor.overrideFunctions) { implementMethods.Add(func->name.value, func); } auto capture = manager->lambdaCaptures[declVisitor.lastFunction]; List> readonlySymbols; CopyFrom(readonlySymbols, From(capture->symbols).Except(declVisitor.variableSymbols)); CopyFrom(capture->symbols, declVisitor.variableSymbols); CopyFrom(capture->symbols, readonlySymbols, true); } } { SortedList searchedTypes; List 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& methods) { FOREACH(IMethodInfo*, method, methods) { manager->errors.Add(WfErrors::InterfaceMethodNotImplemented(node, method)); } }; auto discardSecond = [=](const WString& key, const List>& methods) { FOREACH(Ptr, decl, methods) { Ptr 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& interfaces, const List>& implements) { Group typedInterfaceMethods; Group> typedImplementMethods; FOREACH(IMethodInfo*, method, interfaces) { Ptr methodType = CreateTypeInfoFromMethodInfo(method); typedInterfaceMethods.Add(methodType->GetTypeFriendlyName(), method); } FOREACH(Ptr, decl, implements) { Ptr methodType = GetFunctionDeclarationType(scope, decl); typedImplementMethods.Add(methodType->GetTypeFriendlyName(), decl); } GroupInnerJoin( typedInterfaceMethods, typedImplementMethods, discardFirst, discardSecond, [=](const WString& key, const List& interfaces, const List>& implements) { if (interfaces.Count() > 1) { List 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 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(WfVirtualCfeExpression* node)override { if (GetExpressionType(manager, node->expandedExpression, expectedType)) { results.Add(manager->expressionResolvings[node->expandedExpression.Obj()]); } } void Visit(WfVirtualCseExpression* node)override { bool expanded = node->expandedExpression; vint errorCount = manager->errors.Count(); node->Accept((WfVirtualCseExpression::IVisitor*)this); if (!expanded && manager->errors.Count() == errorCount) { ExpandVirtualExpressionVisitor visitor(manager, expectedType); node->Accept(&visitor); if (!node->expandedExpression) { return; } 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); manager->checkedScopes_DuplicatedSymbol.Remove(parentScope.Obj()); manager->checkedScopes_SymbolType.Remove(parentScope.Obj()); 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>::CreateTypeInfo())); } void Visit(WfNewCoroutineExpression* node)override { Ptr typeInfo = TypeInfoRetriver>::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, type.Obj(), expressionType.Obj())); PASS_VALIDATION:; } } } void Visit(WfExpectedTypeCastExpression* node)override { GetExpressionType(manager, node->expression, nullptr); if (expectedType) { results.Add(ResolveExpressionResult::ReadonlyType(expectedType)); } else { manager->errors.Add(WfErrors::ExpectedTypeCastCannotResolveType(node)); } } void Visit(WfCoOperatorExpression* node)override { auto scope = manager->nodeScopes[node].Obj(); auto functionScope = scope->FindFunctionScope(); if (auto funcDecl = functionScope->ownerNode.Cast()) { if (funcDecl->statement.Cast()) { 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 methods; if (auto group = providerSymbol->typeInfo->GetTypeDescriptor()->GetMethodGroupByName(L"QueryContext", true)) { vint count = group->GetMethodCount(); for (vint i = 0; i < count; i++) { auto method = group->GetMethod(i); if (method->IsStatic()) { if (method->GetParameterCount() == 1 && IsSameType(implSymbol->typeInfo.Obj(), method->GetParameter(0)->GetType())) { methods.Add(ResolveExpressionResult::Method(method)); } } } } if (methods.Count() > 1) { manager->errors.Add(WfErrors::CannotPickOverloadedFunctions(node, methods)); } else if (methods.Count() == 1) { auto contextType = methods[0].methodInfo->GetReturn(); SortedList searchedTypes; manager->ResolveMember(contextType->GetTypeDescriptor(), node->name.value, false, searchedTypes, results); if (results.Count() == 0) { manager->errors.Add(WfErrors::MemberNotExists(node, contextType->GetTypeDescriptor(), node->name.value)); } } else { manager->errors.Add(WfErrors::CoOperatorNotExists(node, providerSymbol->typeInfo.Obj())); } } } } } static void Execute(Ptr expression, WfLexicalScopeManager* manager, Ptr expectedType, List& results) { ValidateSemanticExpressionVisitor visitor(manager, expectedType, results); expression->Accept(&visitor); } }; /*********************************************************************** IsConstantExpression ***********************************************************************/ class ValidateConstantExpressionVisitor : public empty_visitor::ExpressionVisitor , public empty_visitor::VirtualCseExpressionVisitor { public: WfLexicalScopeManager* manager; bool isConstant = false; ValidateConstantExpressionVisitor(WfLexicalScopeManager* _manager) :manager(_manager) { } bool Call(Ptr 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 Dispatch(WfVirtualCfeExpression* node)override { node->expandedExpression->Accept(this); } void Dispatch(WfVirtualCseExpression* node)override { node->Accept((WfVirtualCseExpression::IVisitor*)this); } void Visit(WfReferenceExpression* node)override { VisitReferenceExpression(node, node->name.value); } 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::FlagAnd || node->op == WfBinaryOperator::FlagOr) { isConstant = Call(node->first) && Call(node->second); } } void Visit(WfRangeExpression* node)override { isConstant = Call(node->begin) && Call(node->end); } void Visit(WfConstructorExpression* node)override { auto result = manager->expressionResolvings[node]; bool isStruct = (result.type->GetTypeDescriptor()->GetTypeDescriptorFlags() == TypeDescriptorFlags::Struct); FOREACH(Ptr, argument, node->arguments) { if (argument->key && !isStruct) { if (!Call(argument->key)) return; } if (argument->value) { if (!Call(argument->value)) return; } } isConstant = true; } */ void Visit(WfTypeOfTypeExpression* node)override { isConstant = true; } void Visit(WfTypeOfExpressionExpression* node)override { isConstant = true; } static void Execute(Ptr expression, WfLexicalScopeManager* manager, Ptr expectedType) { if (GetExpressionType(manager, expression, expectedType)) { ValidateConstantExpressionVisitor visitor(manager); expression->Accept(&visitor); if (!visitor.isConstant) { manager->errors.Add(WfErrors::ExpressionIsNotConstant(expression.Obj())); } } } }; /*********************************************************************** ValidateSemantic ***********************************************************************/ void ValidateExpressionSemantic(WfLexicalScopeManager* manager, Ptr expression, Ptr expectedType, collections::List& 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 replaces; FOREACH(Ptr, 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, 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 expression, Ptr expectedType) { ValidateConstantExpressionVisitor::Execute(expression, manager, expectedType); } } } } /*********************************************************************** .\ANALYZER\WFANALYZER_VALIDATESEMANTIC_STATEMENT.CPP ***********************************************************************/ namespace vl { namespace workflow { namespace analyzer { using namespace collections; using namespace reflection; using namespace reflection::description; using namespace typeimpl; /*********************************************************************** ValidateSemantic(Statement) ***********************************************************************/ class ExpandVirtualStatementVisitor : public Object, public WfVirtualCseStatement::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 WfVirtualCseStatement::IVisitor , public WfCoroutineStatement::IVisitor , public WfStateMachineStatement::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()) { auto providerStat = funcDecl->statement.Cast(); 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 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)); } } } if (functions.Count() != 0) { vint selectedFunctionIndex = -1; List> 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 { manager->errors.Add(WfErrors::CoOperatorNotExists(node, providerSymbol->typeInfo.Obj())); } } } else { auto returnType = CreateTypeInfoFromType(scope, funcDecl->returnType); if (node->expression) { if (returnType->GetTypeDescriptor() == description::GetTypeDescriptor()) { manager->errors.Add(WfErrors::CannotReturnExpression(node)); } else { GetExpressionType(manager, node->expression, returnType); } } else if (returnType->GetDecorator() != ITypeInfo::TypeDescriptor || returnType->GetTypeDescriptor() != description::GetTypeDescriptor()) { manager->errors.Add(WfErrors::ReturnMissExpression(node, returnType.Obj())); } } } else { if (node->expression) { manager->errors.Add(WfErrors::CannotReturnExpression(node)); } } } void Visit(WfDeleteStatement* node)override { Ptr 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::CreateTypeInfo(); auto exceptionType = TypeInfoRetriver>::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 boolType = TypeInfoRetriver::CreateTypeInfo(); GetExpressionType(manager, node->expression, boolType); } ValidateStatementSemantic(manager, node->trueBranch); if (node->falseBranch) { ValidateStatementSemantic(manager, node->falseBranch); } } void Visit(WfWhileStatement* node)override { Ptr boolType = TypeInfoRetriver::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, statement, node->statements) { ValidateStatementSemantic(manager, statement); } } void Visit(WfGotoStatement* node)override { auto scope = manager->nodeScopes[node].Obj(); vint counter = 0; while (scope && !scope->functionConfig) { if (auto block = scope->ownerNode.Cast()) { if (block->endLabel.value == node->label.value) { counter++; } } scope = scope->parentScope.Obj(); } if (counter == 0) { manager->errors.Add(WfErrors::GotoLabelNotExists(node)); } else if (counter > 1) { manager->errors.Add(WfErrors::TooManyGotoLabel(node)); } } void Visit(WfExpressionStatement* node)override { GetExpressionType(manager, node->expression, 0); } void Visit(WfVariableStatement* node)override { ValidateDeclarationSemantic(manager, node->variable); } void Visit(WfVirtualCseStatement* node)override { bool expanded = node->expandedStatement; vint errorCount = manager->errors.Count(); node->Accept((WfVirtualCseStatement::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); manager->checkedScopes_DuplicatedSymbol.Remove(parentScope.Obj()); manager->checkedScopes_SymbolType.Remove(parentScope.Obj()); if (!CheckScopes_DuplicatedSymbol(manager) || !CheckScopes_SymbolType(manager)) { return; } } if (node->expandedStatement) { ValidateStatementSemantic(manager, node->expandedStatement); } } void Visit(WfSwitchStatement* node)override { Ptr type = GetExpressionType(manager, node->expression, 0); FOREACH(Ptr, switchCase, node->caseBranches) { Ptr 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 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 funcReturnType; { auto decl = scope->parentScope->ownerNode.Cast(); funcReturnType = CreateTypeInfoFromType(scope->parentScope.Obj(), decl->returnType); } ITypeDescriptor* selectedProviderTd = nullptr; List candidates; if (node->name.value == L"") { if (funcReturnType) { List 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 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(selectedProviderTd, TypeInfoHint::Normal); if (funcReturnType) { WString creatorName; if (funcReturnType->GetTypeDescriptor() == description::GetTypeDescriptor()) { creatorName = L"CreateAndRun"; } else { creatorName = L"Create"; } if (auto group = selectedProviderTd->GetMethodGroupByName(creatorName, true)) { List 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() ) { auto returnType = functionType->GetGenericArgument(0); if (returnType->GetDecorator() == ITypeInfo::SharedPtr &&returnType->GetTypeDescriptor() == description::GetTypeDescriptor()) { 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()) { 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()) { if (funcDecl->statement.Cast()) { 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 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); } } List 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)); } } } } if (functions.Count() == 0) { manager->errors.Add(WfErrors::CoOperatorNotExists(node, providerSymbol->typeInfo.Obj())); } else { vint selectedFunctionIndex = -1; vint oldErrorCount = manager->errors.Count(); List> 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 types; FOREACH(Ptr, 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() && method->GetReturn()->GetTypeDescriptor() != description::GetTypeDescriptor() ) { manager->coCastResultResolvings.Add(node, ResolveExpressionResult::Method(method)); symbol->typeInfo = CopyTypeInfo(method->GetReturn()); break; } } } } } } } if (!symbol->typeInfo) { manager->errors.Add(WfErrors::CoOperatorCannotResolveResultType(node, types)); } } } } } } } } void Visit(WfStateMachineStatement* node)override { node->Accept((WfStateMachineStatement::IVisitor*)this); } void Visit(WfStateSwitchStatement* node)override { auto smcScope = manager->nodeScopes[node]->FindFunctionScope()->parentScope.Obj(); CHECK_ERROR(smcScope->ownerNode.Cast(), L"ValidateSemanticStatementVisitor::Visit(WfStateSwitchStatement*)#ValidateStatementStructure should check state machine statements' location."); FOREACH(Ptr, switchCase, node->caseBranches) { auto caseScope = manager->nodeScopes[switchCase.Obj()].Obj(); Ptr inputSymbol; { vint index = smcScope->symbols.Keys().IndexOf(switchCase->name.value); if (index != -1) { inputSymbol = smcScope->symbols.GetByIndex(index)[0]; } } if (!inputSymbol || !inputSymbol->creatorNode.Cast()) { manager->errors.Add(WfErrors::StateInputNotExists(switchCase.Obj())); } else { auto td = manager->declarationTypes[smcScope->ownerNode.Cast().Obj()].Obj(); auto inputMethod = td->GetMethodGroupByName(switchCase->name.value, false)->GetMethod(0); if (switchCase->arguments.Count() != inputMethod->GetParameterCount()) { manager->errors.Add(WfErrors::StateSwitchArgumentCountNotMatch(switchCase.Obj())); } else { FOREACH_INDEXER(Ptr, argument, index, switchCase->arguments) { auto argumentSymbol = caseScope->symbols[argument->name.value][0]; argumentSymbol->typeInfo = CopyTypeInfo(inputMethod->GetParameter(index)->GetType()); argumentSymbol->type = GetTypeFromTypeInfo(argumentSymbol->typeInfo.Obj()); } } } ValidateStatementSemantic(manager, switchCase->statement); } } void Visit(WfStateInvokeStatement* node)override { auto smcScope = manager->nodeScopes[node]->FindFunctionScope()->parentScope.Obj(); CHECK_ERROR(smcScope->ownerNode.Cast(), L"ValidateSemanticStatementVisitor::Visit(WfStateSwitchStatement*)#ValidateStatementStructure should check state machine statements' location."); Ptr stateSymbol; { vint index = smcScope->symbols.Keys().IndexOf(node->name.value); if (index != -1) { stateSymbol = smcScope->symbols.GetByIndex(index)[0]; } } if (!stateSymbol || !stateSymbol->creatorNode.Cast()) { manager->errors.Add(WfErrors::StateNotExists(node)); } else { auto stateDecl = stateSymbol->creatorNode.Cast(); if (stateDecl->arguments.Count() != node->arguments.Count()) { manager->errors.Add(WfErrors::StateArgumentCountNotMatch(node)); } else { auto stateScope = manager->nodeScopes[stateDecl.Obj()]; FOREACH_INDEXER(Ptr, argument, index, node->arguments) { auto typeInfo = stateScope->symbols[stateDecl->arguments[index]->name.value][0]->typeInfo; GetExpressionType(manager, argument, typeInfo); } } } } static void Execute(Ptr statement, WfLexicalScopeManager* manager) { ValidateSemanticStatementVisitor visitor(manager); statement->Accept(&visitor); } }; /*********************************************************************** ValidateSemantic ***********************************************************************/ void ValidateStatementSemantic(WfLexicalScopeManager* manager, Ptr statement) { return ValidateSemanticStatementVisitor::Execute(statement, manager); } } } } /*********************************************************************** .\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 ***********************************************************************/ void ValidateModuleStructure(WfLexicalScopeManager* manager, Ptr module) { FOREACH(Ptr, path, module->paths) { FOREACH_INDEXER(Ptr, item, index, path->items) { vint counter = 0; FOREACH(Ptr, fragment, item->fragments) { if (fragment.Cast()) { 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]); } } } } } /*********************************************************************** .\ANALYZER\WFANALYZER_VALIDATESTRUCTURE_DECLARATION.CPP ***********************************************************************/ namespace vl { namespace workflow { namespace analyzer { using namespace collections; using namespace parsing; using namespace reflection::description; /*********************************************************************** ValidateStructure(Declaration) ***********************************************************************/ class ValidateStructureDeclarationVisitor : public Object , public WfDeclaration::IVisitor , public WfVirtualCfeDeclaration::IVisitor , public WfVirtualCseDeclaration::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(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(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(surroundingLambda)) { manager->errors.Add(WfErrors::FunctionShouldHaveName(node)); } } ValidateTypeStructure(manager, node->returnType, ValidateTypeStragety::ReturnType); FOREACH(Ptr, 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, argument, node->arguments) { ValidateTypeStructure(manager, argument); } } else if (dynamic_cast(surroundingLambda)) { manager->errors.Add(WfErrors::WrongDeclarationInInterfaceConstructor(node)); } else { manager->errors.Add(WfErrors::WrongDeclaration(node)); } } class FindPropertyRelatedDeclVisitor : public empty_visitor::DeclarationVisitor , public empty_visitor::VirtualCseDeclarationVisitor { public: WfLexicalScopeManager* manager; WfClassDeclaration* classDecl; WfPropertyDeclaration* propDecl; Ptr getter; Ptr setter; Ptr 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(WfVirtualCfeDeclaration* node)override { FOREACH(Ptr, decl, node->expandedDeclarations) { Execute(decl); } } void Dispatch(WfVirtualCseDeclaration* node)override { node->Accept((WfVirtualCseDeclaration::IVisitor*)this); } void Execute(Ptr 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, memberDecl, classDecl->declarations) { visitor.Execute(memberDecl); } if (!visitor.getter || visitor.getter->classMember->kind == WfClassMemberKind::Static || !visitor.getter.Cast()) { manager->errors.Add(WfErrors::PropertyGetterNotFound(node, classDecl)); } if (node->setter.value != L"" && (!visitor.setter || visitor.setter->classMember->kind == WfClassMemberKind::Static || !visitor.setter.Cast())) { manager->errors.Add(WfErrors::PropertySetterNotFound(node, classDecl)); } if (node->valueChangedEvent.value != L"" && (!visitor.valueChangedEvent || visitor.valueChangedEvent->classMember->kind == WfClassMemberKind::Static || !visitor.valueChangedEvent.Cast())) { manager->errors.Add(WfErrors::PropertyEventNotFound(node, classDecl)); } } else if (dynamic_cast(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, call, node->baseConstructorCalls) { ValidateTypeStructure(manager, call->type, ValidateTypeStragety::BaseType, classDecl); FOREACH(Ptr, 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 empty_visitor::VirtualCseDeclarationVisitor { public: WfConstructorDeclaration* ctor = nullptr; void Dispatch(WfVirtualCfeDeclaration* node)override { FOREACH(Ptr, decl, node->expandedDeclarations) { decl->Accept(this); } } void Dispatch(WfVirtualCseDeclaration* node)override { node->Accept((WfVirtualCseDeclaration::IVisitor*)this); } void Visit(WfConstructorDeclaration* node)override { ctor = node; } }; class TooManyDtorVisitor : public empty_visitor::DeclarationVisitor , public empty_visitor::VirtualCseDeclarationVisitor { public: WfLexicalScopeManager* manager; WfClassDeclaration* classDecl; WfDestructorDeclaration* dtor = nullptr; TooManyDtorVisitor(WfLexicalScopeManager* _manager, WfClassDeclaration* _classDecl) :manager(_manager) , classDecl(_classDecl) { } void Dispatch(WfVirtualCfeDeclaration* node)override { FOREACH(Ptr, decl, node->expandedDeclarations) { decl->Accept(this); } } void Dispatch(WfVirtualCseDeclaration* node)override { node->Accept((WfVirtualCseDeclaration::IVisitor*)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(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, memberDecl, node->declarations) { memberDecl->Accept(&visitor); } if (!visitor.ctor) { auto ctor = MakePtr(); node->declarations.Add(ctor); ctor->codeRange = node->codeRange; ctor->classMember = MakePtr(); ctor->classMember->codeRange = node->codeRange; ctor->classMember->kind = WfClassMemberKind::Normal; ctor->constructorType = WfConstructorType::SharedPtr; auto stat = MakePtr(); ctor->statement = stat; stat->codeRange = node->codeRange; } } } break; case WfClassKind::Interface: break; } FOREACH(Ptr, type, node->baseTypes) { ValidateTypeStructure(manager, type, ValidateTypeStragety::BaseType, node); } { TooManyDtorVisitor visitor(manager, node); bool hasStateMachine = false; FOREACH(Ptr, memberDecl, node->declarations) { if (auto smDecl = memberDecl.Cast()) { if (!hasStateMachine) { hasStateMachine = true; } else { manager->errors.Add(WfErrors::DuplicatedDeclaration(smDecl.Obj())); } } 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(surroundingLambda)) { manager->errors.Add(WfErrors::WrongDeclarationInInterfaceConstructor(node)); } vuint64_t current = 0; bool reportedNotConsecutive = false; SortedList discoveredItems; FOREACH(Ptr, item, node->items) { switch (item->kind) { case WfEnumItemKind::Constant: { vuint64_t value = -1; TypedValueSerializerProvider::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, 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(surroundingLambda)) { manager->errors.Add(WfErrors::WrongDeclarationInInterfaceConstructor(node)); } SortedList discoveredItems; FOREACH(Ptr, 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(WfVirtualCfeDeclaration* node)override { node->Accept(static_cast(this)); FOREACH(Ptr, decl, node->expandedDeclarations) { decl->Accept(this); } } void Visit(WfAutoPropertyDeclaration* node)override { switch (node->classMember->kind) { case WfClassMemberKind::Normal: if (dynamic_cast(surroundingLambda)) { manager->errors.Add(WfErrors::AutoPropertyCannotBeNormalOutsideOfClass(node)); } break; case WfClassMemberKind::Static: manager->errors.Add(WfErrors::AutoPropertyCannotBeStatic(node)); break; case WfClassMemberKind::Override: if (!dynamic_cast(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(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 { } void Visit(WfVirtualCseDeclaration* node)override { node->Accept(static_cast(this)); } void Visit(WfStateMachineDeclaration* node)override { if (classDecl) { FOREACH(Ptr, state, node->states) { ValidateStructureContext context; context.currentStateDeclaration = state.Obj(); ValidateStatementStructure(manager, &context, state->statement); } } else { manager->errors.Add(WfErrors::WrongDeclaration(node)); } } static void Execute(Ptr declaration, WfLexicalScopeManager* manager, WfClassDeclaration* classDecl, WfExpression* surroundingLambda) { ValidateStructureDeclarationVisitor visitor(manager, classDecl, surroundingLambda); declaration->Accept(&visitor); } }; /*********************************************************************** ValidateStructure ***********************************************************************/ void ValidateDeclarationStructure(WfLexicalScopeManager* manager, Ptr declaration, WfClassDeclaration* classDecl, WfExpression* surroundingLambda) { ValidateStructureDeclarationVisitor::Execute(declaration, manager, classDecl, surroundingLambda); } } } } /*********************************************************************** .\ANALYZER\WFANALYZER_VALIDATESTRUCTURE_EXPRESSION.CPP ***********************************************************************/ namespace vl { namespace workflow { namespace analyzer { using namespace collections; using namespace parsing; using namespace reflection::description; /*********************************************************************** ValidateStructure(Expression) ***********************************************************************/ class ValidateStructureExpressionVisitor : public Object , public WfExpression::IVisitor , public WfVirtualCseExpression::IVisitor { public: WfLexicalScopeManager* manager; ValidateStructureContext* context; Ptr 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 { ValidateStructureContext context; ValidateExpressionStructure(manager, &context, node->body); } 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, 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, 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()) { manager->errors.Add(WfErrors::WrongSimpleObserveExpression(node->expression.Obj())); } FOREACH(Ptr, event, node->events) { if (!event.Cast()) { manager->errors.Add(WfErrors::WrongSimpleObserveEvent(event.Obj())); } } } else 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, memberDecl, node->declarations) { ValidateDeclarationStructure(manager, memberDecl, nullptr, node); } } void Visit(WfVirtualCfeExpression* node)override { if (node->expandedExpression) { ValidateExpressionStructure(manager, context, node->expandedExpression); } } void Visit(WfVirtualCseExpression* node)override { node->Accept((WfVirtualCseExpression::IVisitor*)this); } 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(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); } void Visit(WfExpectedTypeCastExpression* node)override { ValidateExpressionStructure(manager, context, node->expression); } void Visit(WfCoOperatorExpression* node)override { if (!context->currentCoProviderStatement) { manager->errors.Add(WfErrors::WrongCoOperator(node)); } } static void Execute(Ptr& expression, WfLexicalScopeManager* manager, ValidateStructureContext* context) { ValidateStructureExpressionVisitor visitor(manager, context); expression->Accept(&visitor); if (visitor.result) { expression = visitor.result; } } }; /*********************************************************************** ValidateStructure ***********************************************************************/ void ValidateExpressionStructure(WfLexicalScopeManager* manager, ValidateStructureContext* context, Ptr& expression) { ValidateStructureExpressionVisitor::Execute(expression, manager, context); } } } } /*********************************************************************** .\ANALYZER\WFANALYZER_VALIDATESTRUCTURE_STATEMENT.CPP ***********************************************************************/ namespace vl { namespace workflow { namespace analyzer { using namespace collections; using namespace parsing; using namespace reflection::description; /*********************************************************************** ValidateStructure(Statement) ***********************************************************************/ class ValidateStructureStatementVisitor : public Object , public WfStatement::IVisitor , public WfVirtualCseStatement::IVisitor , public WfCoroutineStatement::IVisitor , public WfStateMachineStatement::IVisitor { public: WfLexicalScopeManager* manager; ValidateStructureContext* context; Ptr 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(WfGotoStatement* node)override { } void Visit(WfExpressionStatement* node)override { ValidateExpressionStructure(manager, context, node->expression); } void Visit(WfVariableStatement* node)override { ValidateDeclarationStructure(manager, node->variable); } void Visit(WfVirtualCseStatement* node)override { node->Accept((WfVirtualCseStatement::IVisitor*)this); } void Visit(WfSwitchStatement* node)override { ValidateExpressionStructure(manager, context, node->expression); FOREACH(Ptr, 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)); } } void Visit(WfStateMachineStatement* node)override { node->Accept((WfStateMachineStatement::IVisitor*)this); } void Visit(WfStateSwitchStatement* node)override { if (!context->currentStateDeclaration) { manager->errors.Add(WfErrors::WrongStateSwitchStatement(node)); } FOREACH(Ptr, switchCase, node->caseBranches) { ValidateStatementStructure(manager, context, switchCase->statement); } } void Visit(WfStateInvokeStatement* node)override { if (!context->currentStateDeclaration) { manager->errors.Add(WfErrors::WrongStateInvokeStatement(node)); } FOREACH(Ptr, argument, node->arguments) { ValidateExpressionStructure(manager, context, argument); } } static void Execute(Ptr& statement, WfLexicalScopeManager* manager, ValidateStructureContext* context) { ValidateStructureStatementVisitor visitor(manager, context); statement->Accept(&visitor); if (visitor.result) { statement = visitor.result; } } }; /*********************************************************************** ValidateStructure ***********************************************************************/ void ValidateStatementStructure(WfLexicalScopeManager* manager, ValidateStructureContext* context, Ptr& statement) { ValidateStructureStatementVisitor::Execute(statement, manager, context); } } } } /*********************************************************************** .\ANALYZER\WFANALYZER_VALIDATESTRUCTURE_TYPE.CPP ***********************************************************************/ namespace vl { namespace workflow { namespace analyzer { using namespace collections; using namespace parsing; using namespace reflection::description; /*********************************************************************** 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(WfObservableListType* node)override { result = false; } void Visit(WfFunctionType* node)override { result = false; } void Visit(WfChildType* node)override { node->parent->Accept(this); } static bool Execute(Ptr 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()) { 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()) { 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()) { 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(WfObservableListType* node)override { if (strategy == ValidateTypeStragety::BaseType) { manager->errors.Add(WfErrors::WrongBaseType(classDecl, node)); } ValidateTypeStructure(manager, node->element); } void Visit(WfFunctionType* node)override { if (strategy == ValidateTypeStragety::BaseType) { manager->errors.Add(WfErrors::WrongBaseType(classDecl, node)); } ValidateTypeStructure(manager, node->result, ValidateTypeStragety::ReturnType); FOREACH(Ptr, 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 type, WfLexicalScopeManager* manager, ValidateTypeStragety strategy, WfClassDeclaration* classDecl) { ValidateStructureTypeVisitor visitor(manager, strategy, classDecl); type->Accept(&visitor); } }; /*********************************************************************** ValidateStructure ***********************************************************************/ void ValidateTypeStructure(WfLexicalScopeManager* manager, Ptr type, ValidateTypeStragety strategy, WfClassDeclaration* classDecl) { ValidateStructureTypeVisitor::Execute(type, manager, strategy, classDecl); } } } } /*********************************************************************** .\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 ***********************************************************************/ WfCppConfig::WfCppConfig(analyzer::WfLexicalScopeManager* _manager, const WString& _assemblyName, const WString& _assemblyNamespace) :manager(_manager) , regexSplitName(L"::") , regexSpecialName(L"/<(/w+)(-(/w+))*/>(/w*)") , regexTemplate(L", /$Arguments|/$Arguments, |/$/l+") , assemblyName(_assemblyName) , assemblyNamespace(_assemblyNamespace) { attributeEvaluator = MakePtr(manager); Collect(); for (vint i = 0; i < enumDecls.Count(); i++) { const auto& values = enumDecls.GetByIndex(i); SortDeclsByName(const_cast>&>(values)); } for (vint i = 0; i < structDecls.Count(); i++) { const auto& values = structDecls.GetByIndex(i); SortDeclsByName(const_cast>&>(values)); } for (vint i = 0; i < classDecls.Count(); i++) { const auto& values = classDecls.GetByIndex(i); SortDeclsByName(const_cast>&>(values)); } AssignClassDeclsToFiles(); } WfCppConfig::~WfCppConfig() { } void WfCppConfig::WriteFunctionBody(stream::StreamWriter& writer, Ptr 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 stat, const WString& prefix, ITypeInfo* expectedType) { GenerateStatement(this, MakePtr(), writer, stat, prefix, WString(L"\t", false), expectedType); } WString WfCppConfig::CppNameToHeaderEnumStructName(const WString& fullName, const WString& type) { return L"__vwsn_" + type + L"s::" + ConvertFullName(fullName, L"_"); } WString WfCppConfig::ConvertNameInternal(const WString& name, const WString& specialNameCategory, bool alwaysUseCategory) { if (name.Length() > 0 && name[0] == L'$') { return L"__vwsno_" + name.Sub(1, name.Length() - 1); } auto match = regexSpecialName.Match(name); if (match) { return specialNameCategory + 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 if (alwaysUseCategory) { return specialNameCategory + name; } { return name; } } WString WfCppConfig::ConvertName(const WString& name) { return ConvertNameInternal(name, WString(L"__vwsn_", false), false); } WString WfCppConfig::ConvertName(const WString& name, const WString& specialNameCategory) { return ConvertNameInternal(name, specialNameCategory, true); } WString WfCppConfig::ConvertFullName(const WString& fullName, WString delimiter) { List> matches; regexSplitName.Split(fullName, false, matches); return (fullName[0] == L':' ? delimiter : WString::Empty) + From(matches) .Select([this](Ptr 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*)#Internal error: Wrong function type."); CHECK_ERROR(typeInfo->GetTypeDescriptor() == description::GetTypeDescriptor(), L"WfCppConfig::ConvertFunctionType(ITypeInfo*)#Internal error: 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()) { return true; } else if (typeInfo->GetTypeDescriptor() == description::GetTypeDescriptor()) { 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, bool useHeaderEnumStructName) { switch (typeInfo->GetDecorator()) { case ITypeInfo::RawPtr: return ConvertType(typeInfo->GetElementType(), useHeaderEnumStructName) + L"*"; case ITypeInfo::SharedPtr: if (typeInfo->GetElementType()->GetDecorator() == ITypeInfo::Generic) { if (typeInfo->GetTypeDescriptor() == description::GetTypeDescriptor()) { return ConvertType(typeInfo->GetElementType(), useHeaderEnumStructName); } else if (typeInfo->GetTypeDescriptor() == description::GetTypeDescriptor()) { return ConvertType(typeInfo->GetElementType(), useHeaderEnumStructName); } } return L"::vl::Ptr<" + ConvertType(typeInfo->GetElementType(), useHeaderEnumStructName) + L">"; case ITypeInfo::Nullable: return L"::vl::Nullable<" + ConvertType(typeInfo->GetElementType(), useHeaderEnumStructName) + L">"; case ITypeInfo::Generic: if (typeInfo->GetTypeDescriptor() == description::GetTypeDescriptor()) { return L"::vl::Func<" + ConvertFunctionType(typeInfo) + L">"; } else if(typeInfo->GetTypeDescriptor() == description::GetTypeDescriptor()) { return L"::vl::collections::LazyList<" + ConvertType(typeInfo->GetGenericArgument(0), useHeaderEnumStructName) + L">"; } else { return ConvertType(typeInfo->GetElementType(), useHeaderEnumStructName); } default:; } if (useHeaderEnumStructName) { switch (typeInfo->GetTypeDescriptor()->GetTypeDescriptorFlags()) { case TypeDescriptorFlags::EnumType: if (tdDecls.Keys().Contains(typeInfo->GetTypeDescriptor())) { return L"::" + CppNameToHeaderEnumStructName(CppGetFullName(typeInfo->GetTypeDescriptor()), L"enum"); } break; case TypeDescriptorFlags::Struct: if (tdDecls.Keys().Contains(typeInfo->GetTypeDescriptor())) { return L"::" + CppNameToHeaderEnumStructName(CppGetFullName(typeInfo->GetTypeDescriptor()), L"struct"); } break; default:; } return ConvertType(typeInfo->GetTypeDescriptor()); } else { return ConvertType(typeInfo->GetTypeDescriptor()); } } WString WfCppConfig::ConvertArgumentType(ITypeInfo* typeInfo) { auto td = typeInfo->GetTypeDescriptor(); bool constRef = td == description::GetTypeDescriptor() || td == description::GetTypeDescriptor() || ( typeInfo->GetDecorator() == ITypeInfo::SharedPtr && typeInfo->GetElementType()->GetDecorator() == ITypeInfo::Generic && ( td == description::GetTypeDescriptor() || td == description::GetTypeDescriptor() ) ); 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()) return L"0"; if (td == description::GetTypeDescriptor()) return L"0"; if (td == description::GetTypeDescriptor()) return L"0"; if (td == description::GetTypeDescriptor()) return L"0"; if (td == description::GetTypeDescriptor()) return L"0"; if (td == description::GetTypeDescriptor()) return L"0"; if (td == description::GetTypeDescriptor()) return L"0"; if (td == description::GetTypeDescriptor()) return L"0"; if (td == description::GetTypeDescriptor()) return L"false"; if (td == description::GetTypeDescriptor()) return L"0.0f"; if (td == description::GetTypeDescriptor()) return L"0.0"; return L""; } bool WfCppConfig::IsClassHasUserImplMethods(Ptr decl, bool searchInternalClasses) { List> unprocessed; CopyFrom(unprocessed, decl->declarations); for (vint i = 0; i < unprocessed.Count(); i++) { auto memberDecl = unprocessed[i]; if (auto cfe = memberDecl.Cast()) { CopyFrom(unprocessed, cfe->expandedDeclarations, true); } else if (auto cse = memberDecl.Cast()) { CopyFrom(unprocessed, cse->expandedDeclarations, true); } else if (auto classDecl = memberDecl.Cast()) { if (searchInternalClasses) { CopyFrom(unprocessed, classDecl->declarations, true); } } else if (attributeEvaluator->GetAttribute(memberDecl->attributes, L"cpp", L"UserImpl")) { return true; } } return false; } vint WfCppConfig::CountClassNamespace(Ptr decl) { vint result = 0; auto scope = manager->nodeScopes[decl.Obj()].Obj(); while (scope) { if (scope->ownerNode.Cast()) { result++; } scope = scope->parentScope.Obj(); } return result; } void WfCppConfig::GetClassNamespace(Ptr decl, collections::List& nss) { auto td = manager->declarationTypes[decl.Obj()].Obj(); auto name = ConvertType(td); vint count = CountClassNamespace(decl); List> matches; regexSplitName.Split(name, false, matches); CopyFrom( nss, From(matches) .Take(count) .Select([this](Ptr match) { return ConvertName(match->Result().Value()); }) ); } WString WfCppConfig::GetClassBaseName(Ptr decl) { auto td = manager->declarationTypes[decl.Obj()].Obj(); auto name = ConvertType(td); vint count = CountClassNamespace(decl); List> matches; regexSplitName.Split(name, false, matches); return From(matches) .Skip(count) .Select([this](Ptr 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& nss, collections::List& 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& nss, WString& name) { List> matches; regexSplitName.Split(fullName, false, matches); List nss2; CopyFrom( nss2, From(matches) .Select([this](Ptr 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& 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_ASSIGNCLASSDECLSTOFILES.CPP ***********************************************************************/ namespace vl { namespace workflow { namespace cppcodegen { using namespace analyzer; using namespace collections; #define ASSIGN_INDEX_KEY(INDEX_DECL, INDEX_KEY, STRING_KEY) \ INDEX_DECL INDEX_KEY = globalDep.allTds.Keys().IndexOf(STRING_KEY); \ CHECK_ERROR(INDEX_KEY != -1, L"WfCppConfig::AssignClassDeclsToFiles()#Internal error.") \ /*********************************************************************** WfCppConfig::GenerateGlobalDep ***********************************************************************/ void WfCppConfig::ExpandClassDeclGroup(Ptr parent, GlobalDep& globalDep) { vint index = classDecls.Keys().IndexOf(parent.Obj()); if (index == -1) return; FOREACH(Ptr, subDecl, classDecls.GetByIndex(index)) { ExpandClassDeclGroup(subDecl, globalDep); } auto directChildren = From(classDecls.GetByIndex(index)) .Select([&](Ptr decl) { auto stringKey = manager->declarationTypes[decl.Obj()]->GetTypeName(); ASSIGN_INDEX_KEY(auto, indexKey, stringKey); return indexKey; }); auto indirectChildren = From(classDecls.GetByIndex(index)) .Select([&](Ptr subDecl) { auto stringKey = manager->declarationTypes[subDecl.Obj()]->GetTypeName(); ASSIGN_INDEX_KEY(auto, indexKey, stringKey); return globalDep.expandedClassDecls.Keys().IndexOf(indexKey); }) .Where([](vint index) { return index != -1; }) .SelectMany([&](vint index) { return From(globalDep.expandedClassDecls.GetByIndex(index)); }); vint indexKey = -1; if (parent) { auto stringKey = manager->declarationTypes[parent.Obj()]->GetTypeName(); ASSIGN_INDEX_KEY(, indexKey, stringKey); } FOREACH(vint, subDecl, directChildren.Concat(indirectChildren)) { globalDep.expandedClassDecls.Add(indexKey, subDecl); } } void WfCppConfig::GenerateClassDependencies(GlobalDep& globalDep) { FOREACH_INDEXER(ITypeDescriptor*, td, tdIndex, globalDep.allTds.Values()) { vint count = td->GetBaseTypeDescriptorCount(); for (vint i = 0; i < count; i++) { auto baseTd = td->GetBaseTypeDescriptor(i); vint baseTdIndex = globalDep.allTds.Keys().IndexOf(baseTd->GetTypeName()); if (baseTdIndex != -1) { globalDep.dependencies.Add(tdIndex, baseTdIndex); } } } } void WfCppConfig::GenerateGlobalDep(GlobalDep& globalDep) { FOREACH_INDEXER(ITypeDescriptor*, td, index, tdDecls.Keys()) { if (tdDecls.Values()[index].Cast()) { globalDep.allTds.Add(td->GetTypeName(), td); } } ExpandClassDeclGroup(nullptr, globalDep); GenerateClassDependencies(globalDep); } /*********************************************************************** WfCppConfig::GenerateClassLevelDep ***********************************************************************/ void WfCppConfig::CollectExpandedDepGroup(vint parentIndexKey, GlobalDep& globalDep, ClassLevelDep& classLevelDep) { const auto& items = globalDep.expandedClassDecls[parentIndexKey]; FOREACH(vint, subDecl, items) { vint index = globalDep.dependencies.Keys().IndexOf(subDecl); if (index != -1) { FOREACH(vint, dep, globalDep.dependencies.GetByIndex(index)) { if (items.Contains(dep)) { classLevelDep.depGroup.Add(subDecl, dep); } } } } } void WfCppConfig::CollectExpandedSubClass(vint subDeclIndexKey, GlobalDep& globalDep, ClassLevelDep& classLevelDep) { classLevelDep.subClass.Add(subDeclIndexKey, subDeclIndexKey); vint index = globalDep.expandedClassDecls.Keys().IndexOf(subDeclIndexKey); if (index != -1) { FOREACH(vint, expandDecl, globalDep.expandedClassDecls.GetByIndex(index)) { classLevelDep.subClass.Add(expandDecl, subDeclIndexKey); } } } void WfCppConfig::GenerateClassLevelDep(Ptr parent, GlobalDep& globalDep, ClassLevelDep& classLevelDep) { classLevelDep.parentClass = parent; if (parent) { auto parentStringKey = manager->declarationTypes[parent.Obj()]->GetTypeName(); ASSIGN_INDEX_KEY(, classLevelDep.parentIndexKey, parentStringKey); } const auto& items = globalDep.expandedClassDecls[classLevelDep.parentIndexKey]; // for any specified class (or top level if nullptr) // find all direct and indirect internal classes // copy their dependencies, and generate sub classes by grouping them using the second level of classes CollectExpandedDepGroup(classLevelDep.parentIndexKey, globalDep, classLevelDep); FOREACH(Ptr, subDecl, classDecls.Get(parent.Obj())) { auto subDeclStringKey = manager->declarationTypes[subDecl.Obj()]->GetTypeName(); ASSIGN_INDEX_KEY(auto, subDeclIndexKey, subDeclStringKey); CollectExpandedSubClass(subDeclIndexKey, globalDep, classLevelDep); } } /*********************************************************************** WfCppConfig::Collect ***********************************************************************/ void WfCppConfig::SortClassDecls(GlobalDep& globalDep) { // sort top level classes and all internal classes inside any classes for (vint i = classDecls.Count() - 1; i >= 0; i--) { // for any specified class (or top level if nullptr) // find all direct and indirect internal classes // copy their dependencies, and generate sub classes by grouping them using the second level of classes auto parent = classDecls.Keys()[i]; ClassLevelDep classLevelDep; GenerateClassLevelDep(parent, globalDep, classLevelDep); // sort them PartialOrderingProcessor pop; const auto& items = globalDep.expandedClassDecls[classLevelDep.parentIndexKey]; pop.InitWithSubClass(items, classLevelDep.depGroup, classLevelDep.subClass); pop.Sort(); // using the partial ordering result to sort the corresponding value list in classDecls { auto& values = const_cast>&>(classDecls.GetByIndex(i)); for (vint j = 0; j < pop.components.Count(); j++) { auto& component = pop.components[j]; // check error if (component.nodeCount > 1) { List tds; for (vint k = 0; k < component.nodeCount; k++) { auto& node = pop.nodes[component.firstNode[k]]; auto indexKey = classLevelDep.subClass[items[node.firstSubClassItem[0]]]; tds.Add(globalDep.allTds.Values()[indexKey]); } Sort(&tds[0], tds.Count(), [](ITypeDescriptor* a, ITypeDescriptor* b) { return WString::Compare(a->GetTypeName(), b->GetTypeName()); }); manager->errors.Add(WfErrors::CppUnableToDecideClassOrder(tdDecls[tds[0]].Cast().Obj(), tds)); } auto& node = pop.nodes[component.firstNode[0]]; auto subDeclIndexKey = classLevelDep.subClass[items[node.firstSubClassItem[0]]]; auto subDecl = tdDecls[globalDep.allTds.Values()[subDeclIndexKey]].Cast(); values[j] = subDecl; } } if (!parent && manager->errors.Count() == 0) { for (vint i = 0; i < classLevelDep.subClass.Count(); i++) { vint index = classLevelDep.subClass.Values()[i]; if (!globalDep.topLevelClasses.Contains(index)) { globalDep.topLevelClasses.Add(index); } } for (vint i = 0; i < pop.nodes.Count(); i++) { auto& keyNode = pop.nodes[i]; vint keyIndex = classLevelDep.subClass[items[keyNode.firstSubClassItem[0]]]; for (vint j = 0; j < keyNode.ins->Count(); j++) { auto& valueNode = pop.nodes[keyNode.ins->Get(j)]; vint valueIndex = classLevelDep.subClass[items[valueNode.firstSubClassItem[0]]]; if (!globalDep.topLevelClassDep.Contains(keyIndex, valueIndex)) { globalDep.topLevelClassDep.Add(keyIndex, valueIndex); } } } } } } void WfCppConfig::GenerateFileClassMaps(GlobalDep& globalDep) { if (classDecls.Keys().Contains(nullptr)) { PartialOrderingProcessor popSubClass; Array customFirstItems; // popSubClass.nodes's index Array nonCustomFirstItems; // popSubClass.nodes's index Array isCustomItems; // popSubClass.nodes's index to boolean (true means custom item) Group subClassDepGroup; // popSubClass.nodes's index to index { // generate sub class using @cpp:File // globalDep.allTds.Keys()'s index to file name Dictionary subClass; for (vint i = 0; i < customFilesClasses.Count(); i++) { WString key = customFilesClasses.Keys()[i]; if (key != L"") { FOREACH(Ptr, decl, customFilesClasses.GetByIndex(i)) { auto stringKey = manager->declarationTypes[decl.Obj()]->GetTypeName(); ASSIGN_INDEX_KEY(auto, indexKey, stringKey); subClass.Add(indexKey, key); } } } // check if all components contains either all classes of the same @cpp:File or a single non-@cpp:File class popSubClass.InitWithSubClass(globalDep.topLevelClasses, globalDep.topLevelClassDep, subClass); popSubClass.Sort(); for (vint i = 0; i < popSubClass.components.Count(); i++) { auto& component = popSubClass.components[i]; // check error if (component.nodeCount > 1) { List tds; for (vint j = 0; j < component.nodeCount; j++) { auto& node = popSubClass.nodes[component.firstNode[j]]; for (vint k = 0; k < node.subClassItemCount; k++) { auto indexKey = globalDep.topLevelClasses[node.firstSubClassItem[k]]; tds.Add(globalDep.allTds.Values()[indexKey]); } } Sort(&tds[0], tds.Count(), [](ITypeDescriptor* a, ITypeDescriptor* b) { return WString::Compare(a->GetTypeName(), b->GetTypeName()); }); manager->errors.Add(WfErrors::CppUnableToSeparateCustomFile(tdDecls[tds[0]].Cast().Obj(), tds)); } } if (manager->errors.Count() != 0) { return; } // generate two item list, one have all @cpp:File classes put in front, one have all non-@cpp:File classes put in front // popSubClass.nodes's index { List customItems; List nonCustomItems; // categorize popSubClass.nodes's index to customItems and nonCustomItems for (vint i = 0; i < popSubClass.nodes.Count(); i++) { auto& node = popSubClass.nodes[i]; if (subClass.Keys().Contains(globalDep.topLevelClasses[node.firstSubClassItem[0]])) { customItems.Add(i); } else { nonCustomItems.Add(i); } } // sort items using allTds.Keys()'s index auto SortNodes = [&](List& items) { if (items.Count() > 0) { Sort(&items[0], items.Count(), [&](vint a, vint b) { auto& nodeA = popSubClass.nodes[a]; auto& nodeB = popSubClass.nodes[b]; vint indexA = From(nodeA.firstSubClassItem, nodeA.firstSubClassItem + nodeA.subClassItemCount) .Select([&](vint index) {return globalDep.topLevelClasses[index]; }) .Min(); vint indexB = From(nodeB.firstSubClassItem, nodeB.firstSubClassItem + nodeB.subClassItemCount) .Select([&](vint index) {return globalDep.topLevelClasses[index]; }) .Min(); return indexA - indexB; }); } }; SortNodes(customItems); SortNodes(nonCustomItems); // prepare customFirstItems, nonCustomFirstItems and isCustomItems isCustomItems.Resize(customItems.Count() + nonCustomItems.Count()); for (vint i = 0; i < customItems.Count(); i++) { isCustomItems[customItems[i]] = true; } for (vint i = 0; i < nonCustomItems.Count(); i++) { isCustomItems[nonCustomItems[i]] = false; } CopyFrom(customFirstItems, customItems); CopyFrom(nonCustomFirstItems, nonCustomItems); CopyFrom(nonCustomFirstItems, customItems, true); CopyFrom(customFirstItems, nonCustomItems, true); } } // copy popSubClass's sub class dependencies to subClassDepGroup for (vint i = 0; i < popSubClass.nodes.Count(); i++) { auto& node = popSubClass.nodes[i]; for (vint j = 0; j < node.ins->Count(); j++) { subClassDepGroup.Add(i, node.ins->Get(j)); } } // sort using inputs of two orders PartialOrderingProcessor popCustomFirst; popCustomFirst.InitWithGroup(customFirstItems, subClassDepGroup); popCustomFirst.Sort(); PartialOrderingProcessor popNonCustomFirst; popNonCustomFirst.InitWithGroup(nonCustomFirstItems, subClassDepGroup); popNonCustomFirst.Sort(); CHECK_ERROR(popCustomFirst.components.Count() == customFirstItems.Count(), L"WfCppConfig::AssignClassDeclsToFiles()#Internal error: Unexpected circle dependency found, this should have been caught by code above."); CHECK_ERROR(popNonCustomFirst.components.Count() == nonCustomFirstItems.Count(), L"WfCppConfig::AssignClassDeclsToFiles()#Future error: Unexpected circle dependency found, this should have been caught by code above."); CHECK_ERROR(popCustomFirst.components.Count() == popNonCustomFirst.components.Count(), L"WfCppConfig::AssignClassDeclsToFiles()#Future error: Unexpected circle dependency found, this should have been caught by code above."); // translate popCustomFirst's sorting result // popSubClass.nodes's index Array customFirstOrder(popCustomFirst.components.Count()); for (vint i = 0; i < popCustomFirst.components.Count(); i++) { auto& component = popCustomFirst.components[i]; customFirstOrder[i] = customFirstItems[component.firstNode[0]]; } // translate popNonCustomFirst's sorting result // popSubClass.nodes's index Array nonCustomFirstOrder(popNonCustomFirst.components.Count()); for (vint i = 0; i < popNonCustomFirst.components.Count(); i++) { auto& component = popNonCustomFirst.components[i]; nonCustomFirstOrder[i] = nonCustomFirstItems[component.firstNode[0]]; } // dispatch non-@cpp:File classes to non-@cpp:File headers vint currentHeaderIndex = 0; vint nonCustomFirstOrderPicked = 0; vint customFirstOrderPicked = 0; Array visited(customFirstOrder.Count()); for (vint i = 0; i < visited.Count(); i++) { visited[i] = false; } auto pickItems = [&](Array& order, vint& picked, bool customItem) { while (picked < order.Count()) { vint item = order[picked]; if (visited[item]) { picked++; } else if (isCustomItems[item] == customItem) { visited[item] = true; picked++; if(!customItem) { auto& node = popSubClass.nodes[item]; for (vint i = 0; i < node.subClassItemCount; i++) { auto indexKey = globalDep.topLevelClasses[node.firstSubClassItem[i]]; auto td = globalDep.allTds.Values()[indexKey]; headerFilesClasses.Add(currentHeaderIndex, tdDecls[td].Cast()); } } } else { break; } } }; while (nonCustomFirstOrderPicked < nonCustomFirstOrder.Count() || customFirstOrderPicked < customFirstOrder.Count()) { pickItems(nonCustomFirstOrder, nonCustomFirstOrderPicked, false); pickItems(customFirstOrder, customFirstOrderPicked, false); pickItems(nonCustomFirstOrder, nonCustomFirstOrderPicked, true); pickItems(customFirstOrder, customFirstOrderPicked, true); currentHeaderIndex++; } // calculate header includes // globalDep.allTds.keys()'s index to header index Dictionary headers; auto addToHeaders = [&](const List>& decls, vint headerIndex) { FOREACH(Ptr, decl, decls) { auto stringKey = manager->declarationTypes[decl.Obj()]->GetTypeName(); ASSIGN_INDEX_KEY(auto, indexKey, stringKey); headers.Add(indexKey, headerIndex); } }; auto calculateIncludes = [&](const List>& decls, SortedList& includes) { FOREACH(Ptr, decl, decls) { auto stringKey = manager->declarationTypes[decl.Obj()]->GetTypeName(); ASSIGN_INDEX_KEY(auto, indexKey, stringKey); vint index = globalDep.topLevelClassDep.Keys().IndexOf(indexKey); if (index != -1) { const auto& values = globalDep.topLevelClassDep.GetByIndex(index); for (vint i = 0; i < values.Count(); i++) { vint header = headers[values[i]]; if (header != 0 && !includes.Contains(header)) { includes.Add(header); } } } } }; for (vint i = 0; i < customFilesClasses.Count(); i++) { if (customFilesClasses.Keys()[i] != L"") { addToHeaders(customFilesClasses.GetByIndex(i), i); } } for (vint i = 0; i < headerFilesClasses.Count(); i++) { addToHeaders(headerFilesClasses.GetByIndex(i), -headerFilesClasses.Keys()[i]); } for (vint i = 0; i < customFilesClasses.Count(); i++) { if (customFilesClasses.Keys()[i] != L"") { SortedList includes; calculateIncludes(customFilesClasses.GetByIndex(i), includes); for (vint j = 0; j < includes.Count(); j++) { headerIncludes.Add(i, includes[j]); } } } for (vint i = 0; i < headerFilesClasses.Count(); i++) { if (headerFilesClasses.Keys()[i] != 0) { SortedList includes; calculateIncludes(headerFilesClasses.GetByIndex(i), includes); for (vint j = 0; j < includes.Count(); j++) { headerIncludes.Add(-headerFilesClasses.Keys()[i], includes[j]); } } } } } void WfCppConfig::SortFileClassMaps(GlobalDep& globalDep) { // sort customFilesClasses and headerFilesClasses according to classDecls[nullptr] if (classDecls.Keys().Contains(nullptr)) { List> ordered; CopyFrom(ordered, classDecls[nullptr]); for (vint i = 0; i < customFilesClasses.Count(); i++) { auto& values = const_cast>&>(customFilesClasses.GetByIndex(i)); Sort>(&values[0], values.Count(), [&](Ptr a, Ptr b) { vint aIndex = ordered.IndexOf(a.Obj()); vint bIndex = ordered.IndexOf(b.Obj()); return aIndex - bIndex; }); } for (vint i = 0; i < headerFilesClasses.Count(); i++) { auto& values = const_cast>&>(headerFilesClasses.GetByIndex(i)); Sort>(&values[0], values.Count(), [&](Ptr a, Ptr b) { vint aIndex = ordered.IndexOf(a.Obj()); vint bIndex = ordered.IndexOf(b.Obj()); return aIndex - bIndex; }); } } } void WfCppConfig::AssignClassDeclsToFiles() { GlobalDep globalDep; GenerateGlobalDep(globalDep); if (manager->errors.Count() == 0) SortClassDecls(globalDep); if (manager->errors.Count() == 0) GenerateFileClassMaps(globalDep); if (manager->errors.Count() == 0) SortFileClassMaps(globalDep); } #undef ASSIGN_INDEX_KEY } } } /*********************************************************************** .\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(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) { 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(config->manager->declarationMemberInfos[node].Obj()); auto typeInfo = eventInfo->GetHandlerType(); writer.WriteString(prefix); writer.WriteString(L"::vl::EventGetGenericArgumentCount(); 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(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(WfVirtualCfeDeclaration* node)override { FOREACH(Ptr, decl, node->expandedDeclarations) { decl->Accept(this); } } void Visit(WfVirtualCseDeclaration* node)override { FOREACH(Ptr, decl, node->expandedDeclarations) { decl->Accept(this); } } }; class WfGenerateClassMemberInitVisitor : public empty_visitor::DeclarationVisitor { public: WfCppConfig * config; stream::StreamWriter& writer; WString prefix; vint& callIndex; WfGenerateClassMemberInitVisitor(WfCppConfig* _config, stream::StreamWriter& _writer, const WString& _prefix, vint& _callIndex) :config(_config) , writer(_writer) , prefix(_prefix) , callIndex(_callIndex) { } void WriteVariableHeader(WfVariableDeclaration* node) { writer.WriteString(prefix); if (callIndex++ == 0) { writer.WriteString(L"\t: "); } else { writer.WriteString(L"\t, "); } writer.WriteString(config->ConvertName(node->name.value)); } void Visit(WfVariableDeclaration* node)override { auto scope = config->manager->nodeScopes[node].Obj(); auto symbol = scope->symbols[node->name.value][0]; auto typeInfo = symbol->typeInfo; if (node->expression) { WriteVariableHeader(node); writer.WriteString(L"("); GenerateExpression(config, writer, node->expression, typeInfo.Obj()); writer.WriteLine(L")"); } else { auto defaultValue = config->DefaultValue(typeInfo.Obj()); if (defaultValue != L"") { WriteVariableHeader(node); writer.WriteString(L"("); writer.WriteString(defaultValue); writer.WriteLine(L")"); } } } void Dispatch(WfVirtualCfeDeclaration* node)override { FOREACH(Ptr, decl, node->expandedDeclarations) { decl->Accept(this); } } void Dispatch(WfVirtualCseDeclaration* node)override { FOREACH(Ptr, decl, node->expandedDeclarations) { decl->Accept(this); } } }; void GenerateClassMemberDecl(WfCppConfig* config, stream::StreamWriter& writer, const WString& className, Ptr 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; WfClassDeclaration* classDef; WString classBaseName; WString className; WString classFullName; WString prefix; bool printableMember = false; WfGenerateClassMemberImplVisitor(WfCppConfig* _config, stream::StreamWriter& _writer, WfClassDeclaration* _classDef, const WString& _classBaseName, const WString& _className, const WString& _classFullName, const WString& _prefix) :config(_config) , writer(_writer) , classDef(_classDef) , classBaseName(_classBaseName) , className(_className) , classFullName(_classFullName) , prefix(_prefix) { } void WriteNotImplemented(const WString& classFullName) { writer.WriteString(prefix); writer.WriteLine(L"{/* USER_CONTENT_BEGIN(" + classFullName + L") */"); writer.WriteString(prefix); writer.WriteLine(L"\tthrow ::vl::Exception(L\"You should implement this function.\");"); writer.WriteString(prefix); writer.WriteLine(L"}/* USER_CONTENT_END() */"); } void Visit(WfNamespaceDeclaration* node)override { } void Visit(WfFunctionDeclaration* node)override { if (!IsVirtual(config, node)) { printableMember = true; writer.WriteString(prefix); auto returnType = config->WriteFunctionHeader(writer, node, classBaseName + L"::" + config->ConvertName(node->name.value), true); writer.WriteLine(L""); bool userImpl = config->attributeEvaluator->GetAttribute(node->attributes, L"cpp", L"UserImpl"); if (userImpl) { WriteNotImplemented(classFullName); } 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(config->manager->declarationMemberInfos[node].Obj()); List arguments; FOREACH(Ptr, argument, node->arguments) { arguments.Add(config->ConvertName(argument->name.value)); } writer.WriteString(prefix); config->WriteFunctionHeader(writer, methodInfo, arguments, classBaseName + L"::" + className, false); writer.WriteLine(L""); vint callIndex = 0; FOREACH(Ptr, call, node->baseConstructorCalls) { auto callType = CreateTypeInfoFromType(scope, call->type, false); 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, argument, argumentIndex, call->arguments) { if (argumentIndex) writer.WriteString(L", "); GenerateExpression(config, writer, argument, callCtor->GetParameter(argumentIndex)->GetType()); } writer.WriteLine(L")"); } if (classDef) { WfGenerateClassMemberInitVisitor visitor(config, writer, prefix, callIndex); FOREACH(Ptr, member, classDef->declarations) { member->Accept(&visitor); } } bool userImpl = config->attributeEvaluator->GetAttribute(node->attributes, L"cpp", L"UserImpl"); if (userImpl) { WriteNotImplemented(classFullName); } else { config->WriteFunctionBody(writer, node->statement, prefix, nullptr); } } void Visit(WfDestructorDeclaration* node)override { printableMember = true; writer.WriteLine(prefix + classBaseName + L"::~" + className + L"()"); bool userImpl = config->attributeEvaluator->GetAttribute(node->attributes, L"cpp", L"UserImpl"); if (userImpl) { WriteNotImplemented(classFullName); } 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(WfVirtualCfeDeclaration* node)override { FOREACH(Ptr, decl, node->expandedDeclarations) { decl->Accept(this); } } void Visit(WfVirtualCseDeclaration* node)override { FOREACH(Ptr, decl, node->expandedDeclarations) { decl->Accept(this); } } }; bool GenerateClassMemberImpl(WfCppConfig* config, stream::StreamWriter& writer, WfClassDeclaration* classDef, const WString& classBaseName, const WString& className, const WString& classFullName, Ptr memberDecl, const WString& prefix) { WfGenerateClassMemberImplVisitor visitor(config, writer, classDef, 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()) { 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 Visit(WfClassDeclaration* node)override { config->classDecls.Add(surroundingClassDecl, node); config->tdDecls.Add(config->manager->declarationTypes[node].Obj(), node); if (!surroundingClassDecl) { WString file; if (auto att = config->attributeEvaluator->GetAttribute(node->attributes, L"cpp", L"File")) { auto attValue = config->attributeEvaluator->GetAttributeValue(att); CHECK_ERROR(attValue.type == runtime::WfInsType::String, L"Unexpected value in attribute: @cpp.File."); file = attValue.stringValue; } config->customFilesClasses.Add(file, node); } auto oldSurroundingClassDecl = surroundingClassDecl; surroundingClassDecl = node; traverse_visitor::DeclarationVisitor::Visit(node); surroundingClassDecl = oldSurroundingClassDecl; } void Traverse(WfEnumDeclaration* node)override { config->enumDecls.Add(surroundingClassDecl, node); config->tdDecls.Add(config->manager->declarationTypes[node].Obj(), node); } void Traverse(WfStructDeclaration* node)override { config->structDecls.Add(surroundingClassDecl, node); config->tdDecls.Add(config->manager->declarationTypes[node].Obj(), node); } 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 module) { WfCollectModuleVisitor(config).VisitField(module.Obj()); } /*********************************************************************** WfCppConfig::CollectClosureInfo ***********************************************************************/ class WfCppCollectClassExprInfoVisitor : public empty_visitor::DeclarationVisitor { public: WfCppConfig* config; vint variableCount = 0; Ptr capture; WfCppCollectClassExprInfoVisitor(WfCppConfig* _config) :config(_config) { } void Visit(WfVariableDeclaration* node)override { variableCount++; } void Dispatch(WfVirtualCfeDeclaration* node)override { FOREACH(Ptr, decl, node->expandedDeclarations) { decl->Accept(this); } } void Dispatch(WfVirtualCseDeclaration* node)override { FOREACH(Ptr, decl, node->expandedDeclarations) { decl->Accept(this); } } void Execute(WfNewInterfaceExpression* node) { capture = config->manager->lambdaCaptures[node]; FOREACH(Ptr, memberDecl, node->declarations) { memberDecl->Accept(this); } } }; Ptr WfCppConfig::CollectClosureInfo(Ptr closure) { using SymbolPair = Pair>; auto info = MakePtr(); WfLexicalScope* scope = nullptr; if (auto ordered = closure.Cast()) { // stable symbol order by sorting them by name CopyFrom( info->symbols, From(manager->lambdaCaptures[ordered.Obj()]->symbols) .Select([](Ptr symbol) { return SymbolPair(symbol->name, symbol); }) ); scope = manager->nodeScopes[ordered.Obj()].Obj(); } else if (auto funcExpr = closure.Cast()) { // stable symbol order by sorting them by name CopyFrom( info->symbols, From(manager->lambdaCaptures[funcExpr->function.Obj()]->symbols) .Select([](Ptr symbol) { return SymbolPair(symbol->name, symbol); }) ); scope = manager->nodeScopes[funcExpr->function.Obj()].Obj(); } else if (auto classExpr = closure.Cast()) { 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 symbol) { return SymbolPair(symbol->name, symbol); }) ); CopyFrom( info->ctorArgumentSymbols, From(visitor.capture->ctorArgumentSymbols) .Select([](Ptr symbol) { return SymbolPair(symbol->name, symbol); }) ); } scope = manager->nodeScopes[classExpr.Obj()].Obj(); } Ptr 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::Collect ***********************************************************************/ void WfCppConfig::Collect() { FOREACH(Ptr, module, manager->GetModules()) { CollectModule(this, module); } FOREACH(Ptr, lambda, lambdaExprs.Keys()) { auto closureInfo = CollectClosureInfo(lambda); closureInfo->lambdaClassName = lambdaExprs[lambda.Obj()]; closureInfos.Add(lambda, closureInfo); } FOREACH(Ptr, classExpr, classExprs.Keys()) { auto closureInfo = CollectClosureInfo(classExpr); closureInfo->lambdaClassName = classExprs[classExpr.Obj()]; closureInfos.Add(classExpr, closureInfo); } } } } } /*********************************************************************** .\CPP\WFCPP_EXPRESSION.CPP ***********************************************************************/ namespace vl { namespace workflow { namespace cppcodegen { using namespace collections; using namespace regex; using namespace stream; using namespace reflection; using namespace reflection::description; using namespace analyzer; /*********************************************************************** Expression Helpers ***********************************************************************/ template void WriteBoxValue(WfCppConfig* config, stream::StreamWriter& writer, ITypeInfo* type, const T& writeExpression) { writer.WriteString(L"::vl::__vwsn::Box("); writeExpression(); writer.WriteString(L")"); } template 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 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 void ConvertValueType(WfCppConfig* config, stream::StreamWriter& writer, ITypeDescriptor* fromTd, ITypeDescriptor* toTd, const T& writeExpression) { if (fromTd == toTd) { writeExpression(); } else if (fromTd == description::GetTypeDescriptor()) { writer.WriteString(L"::vl::__vwsn::Parse<"); writer.WriteString(config->ConvertType(toTd)); writer.WriteString(L">("); writeExpression(); writer.WriteString(L")"); } else if (toTd == description::GetTypeDescriptor()) { 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& 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(); if (toType->GetTypeDescriptor() == tdVe) { if (toType->GetElementType()->GetDecorator() == ITypeInfo::Generic) { if ((fromType->GetTypeDescriptor() == tdVe && fromType->GetElementType()->GetDecorator() != ITypeInfo::Generic) || fromType->GetTypeDescriptor()->CanConvertTo(description::GetTypeDescriptor()) || fromType->GetTypeDescriptor()->CanConvertTo(description::GetTypeDescriptor()) ) { 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 void WriteBoxValue(ITypeInfo* type, const T& writeExpression) { cppcodegen::WriteBoxValue(config, writer, type, writeExpression); } template void WriteUnboxValue(ITypeInfo* type, const T& writeExpression) { cppcodegen::WriteUnboxValue(config, writer, type, writeExpression); } template void WriteUnboxWeakValue(ITypeInfo* type, const T& writeExpression) { cppcodegen::WriteUnboxWeakValue(config, writer, type, writeExpression); } void ConvertMultipleTypes(ITypeInfo** types, vint typesLength, Func 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 node, ITypeInfo* expectedType = nullptr, bool useReturnValue = true) { GenerateExpression(config, writer, node, expectedType, useReturnValue); } Ptr GetClosureInfo(WfExpression* node, Ptr testCtorArgumentSymbol = nullptr) { Ptr closureInfo; auto scope = config->manager->nodeScopes[node].Obj(); if (dynamic_cast(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(source)) { closureInfo = config->closureInfos[ordered]; break; } else if (auto funcExpr = dynamic_cast(source)) { closureInfo = config->closureInfos[funcExpr]; break; } else if (auto classExpr = dynamic_cast(source)) { closureInfo = config->closureInfos[classExpr]; break; } } else if (auto classExpr = scope->ownerNode.Cast()) { 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 void WriteTemplate(const WString& templateValue, const T& callback) { List> matches; config->regexTemplate.Cut(templateValue, false, matches); FOREACH(Ptr, 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 symbol, bool forLambdaArgument) { if (auto varDecl = symbol->creatorNode.Cast()) { auto ownerNode = symbol->ownerScope->ownerNode; if (ownerNode.Cast() || ownerNode.Cast()) { 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"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()) { auto ownerNode = symbol->ownerScope->ownerNode; if (ownerNode.Cast() || ownerNode.Cast()) { 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()) { writer.WriteString(config->ConvertType(symbol->typeInfo.Obj())); writer.WriteString(L"(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(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::ObservableList: case TypeInfoHint::Dictionary: return true; default: return false; } } template 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 void WriteInvokeTemplate(vint count, ITypeInfo* returnType, const TType& typeCallback, const TInvoke& invokeCallback, const TArgument& argumentCallback, TInfo* info, bool castReturnValue) { if (Range(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::ObservableList: writer.WriteString(L"::vl::collections::ObservableList<"); 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 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 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 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 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) { VisitThisExpression(node, methodInfo->GetOwnerTypeDescriptor()); return true; }, [&](IPropertyInfo* propertyInfo) { auto isRef = (propertyInfo->GetOwnerTypeDescriptor()->GetTypeDescriptorFlags() & TypeDescriptorFlags::ReferenceType) != TypeDescriptorFlags::Undefined; VisitThisExpression(node, propertyInfo->GetOwnerTypeDescriptor()); 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(); Ptr enumValueType; if (result.type->GetDecorator() == ITypeInfo::TypeDescriptor) { enumValueType = result.type; } else { enumValueType = MakePtr(result.type->GetTypeDescriptor(), TypeInfoHint::Normal); } vint index = enumType->IndexOfItem(name); if (index != -1) { ITypeInfo* types[] = { enumValueType.Obj(),result.type.Obj() }; ConvertMultipleTypes(types, (sizeof(types) / sizeof(*types)), [=]() { writer.WriteString(config->ConvertType(result.type->GetTypeDescriptor())); 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 closureInfo, WfExpression* node) { vint index = 0; FOREACH(Ptr, 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()"); } else if (parentResult.type->GetDecorator() == ITypeInfo::Nullable) { writer.WriteString(L".Value()"); } 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(); writer.WriteString(L"static_cast<"); writer.WriteString(config->ConvertType(td)); writer.WriteString(L">("); if (td == description::GetTypeDescriptor()) { writer.WriteString(node->value.value + L"f"); } else { writer.WriteString(node->value.value); } writer.WriteString(L")"); } void Visit(WfIntegerExpression* node)override { auto result = config->manager->expressionResolvings[node]; auto td = result.type->GetTypeDescriptor(); writer.WriteString(L"static_cast<"); writer.WriteString(config->ConvertType(td)); writer.WriteString(L">("); if (td == description::GetTypeDescriptor()) { writer.WriteString(node->value.value + L"U"); } else if (td == description::GetTypeDescriptor()) { writer.WriteString(node->value.value + L"L"); } else if (td == description::GetTypeDescriptor()) { writer.WriteString(node->value.value + L"UL"); } else { writer.WriteString(node->value.value); } writer.WriteString(L")"); } 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()) { 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() || type == description::GetTypeDescriptor() || type == description::GetTypeDescriptor() || type == description::GetTypeDescriptor() ; } 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(); if (CppExists(propInfo)) { if (propInfo->GetCpp() == nullptr && propInfo->GetSetter() != nullptr) { WriteMethodTemplate(CppGetInvokeTemplate(propInfo->GetSetter()), propInfo->GetSetter(), [&](IMethodInfo*) { if (member) { writer.WriteString(L"::vl::__vwsn::This("); Call(member->parent); auto parentResult = config->manager->expressionResolvings[member->parent.Obj()]; if (parentResult.type->GetDecorator() == ITypeInfo::SharedPtr) { writer.WriteString(L".Obj()"); } writer.WriteString(L")"); } else { VisitThisExpression(node->first.Obj(), propInfo->GetOwnerTypeDescriptor()); } return true; }, [&](IMethodInfo*, vint index) { Call(node->second); }, useReturnValue); } else { writer.WriteString(L"("); WritePropertyTemplate(CppGetReferenceTemplate(propInfo), propInfo, [&](IPropertyInfo*) { if (member) { writer.WriteString(L"::vl::__vwsn::This("); Call(member->parent); auto parentResult = config->manager->expressionResolvings[member->parent.Obj()]; if (parentResult.type->GetDecorator() == ITypeInfo::SharedPtr) { writer.WriteString(L".Obj()"); } writer.WriteString(L")"); } else { VisitThisExpression(node->first.Obj(), propInfo->GetOwnerTypeDescriptor()); } return true; }, true); writer.WriteString(L" = "); Call(node->second, propInfo->GetReturn()); writer.WriteString(L")"); } } else { WriteNotExists(propInfo); } } else if (auto binary = node->first.Cast()) { 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()) { 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())) { WriteBoxValue(keyType, [&]() {Call(node->second); }); } else { Call(node->second); } writer.WriteString(L")"); }); } } else if (node->op == WfBinaryOperator::FlagAnd) { auto type = config->manager->expressionResolvings[node].type; if (type->GetTypeDescriptor() == description::GetTypeDescriptor()) { VisitBinaryExpression(node, L"+", nullptr, type.Obj()); } else { VisitBinaryExpression(node, L"&", nullptr, nullptr); } } else if (node->op == WfBinaryOperator::FlagOr) { 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("); Call(node->first); writer.WriteString(L"), static_cast("); 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()) { 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, 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, 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()) { 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()) { auto elementType = result.type->GetElementType()->GetGenericArgument(0); writer.WriteString(L"(::vl::__vwsn::CreateList()"); FOREACH(Ptr, argument, node->arguments) { writer.WriteString(L".Add("); Call(argument->key); writer.WriteString(L")"); } writer.WriteString(L").list"); } else if (result.type->GetTypeDescriptor() == description::GetTypeDescriptor()) { auto elementType = result.type->GetElementType()->GetGenericArgument(0); writer.WriteString(L"(::vl::__vwsn::CreateObservableList()"); FOREACH(Ptr, argument, node->arguments) { writer.WriteString(L".Add("); Call(argument->key); writer.WriteString(L")"); } writer.WriteString(L").list"); } else if (result.type->GetTypeDescriptor() == description::GetTypeDescriptor()) { auto keyType = result.type->GetElementType()->GetGenericArgument(0); auto valueType = result.type->GetElementType()->GetGenericArgument(1); writer.WriteString(L"(::vl::__vwsn::CreateDictionary()"); FOREACH(Ptr, 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, argument, node->arguments) { writer.WriteString(L" __vwsn_temp__."); writer.WriteString(argument->key.Cast()->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 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 = [&]() { return GenerateToStream([&](StreamWriter& writer) { WfPrint(node, WString::Empty, writer); }); }; 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("); Call(node->expression); writer.WriteString(L"))"); break; case WfTypeTesting::IsNotNull: writer.WriteString(L"static_cast("); 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("); Call(node->expression); writer.WriteString(L"))"); break; case WfTypeTesting::IsNotNull: writer.WriteString(L"static_cast("); Call(node->expression); writer.WriteString(L")"); break; case WfTypeTesting::IsType: if (type->GetTypeDescriptor() == result.type->GetTypeDescriptor()) { writer.WriteString(L"static_cast("); 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()) { 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()) { 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) { if (auto member = node->function.Cast()) { writer.WriteString(L"::vl::__vwsn::This("); Call(member->parent); auto parentResult = config->manager->expressionResolvings[member->parent.Obj()]; if (parentResult.type->GetDecorator() == ITypeInfo::SharedPtr) { writer.WriteString(L".Obj()"); } writer.WriteString(L")"); } else { VisitThisExpression(node, td); } 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()) { if (result.symbol->ownerScope->ownerNode.Cast()) { writer.WriteString(L"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(WfVirtualCfeExpression* node)override { Call(node->expandedExpression); } void Visit(WfVirtualCseExpression* node)override { Call(node->expandedExpression); } }; void GenerateExpression(WfCppConfig* config, stream::StreamWriter& writer, Ptr 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()"); } 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"); } void WfCppConfig::WriteHeader(stream::StreamWriter& writer, bool multiFile) { WritePushCompileOptions(writer); writer.WriteLine(L""); { Dictionary> reversedLambdaExprs; Dictionary> reversedClassExprs; SortClosure(reversedLambdaExprs, reversedClassExprs); if (reversedLambdaExprs.Count() + reversedClassExprs.Count() > 0) { writer.WriteString(L"namespace "); writer.WriteLine(assemblyNamespace); writer.WriteLine(L"{"); FOREACH(Ptr, expr, reversedLambdaExprs.Values()) { WriteHeader_ClosurePreDecl(writer, expr); } FOREACH(Ptr, expr, reversedClassExprs.Values()) { WriteHeader_ClosurePreDecl(writer, expr); } writer.WriteLine(L"}"); writer.WriteLine(L""); } } List nss; if (enumDecls.Count() > 0) { WriteHeader_MainHeaderEnums(writer, nss); if (enumDecls.Keys().Contains(nullptr)) { FOREACH(Ptr, decl, enumDecls[nullptr]) { WriteHeader_Enum(writer, decl, nss, false); } writer.WriteLine(L""); } } if (structDecls.Count() > 0) { WriteHeader_MainHeaderStructs(writer, nss); if (structDecls.Keys().Contains(nullptr)) { FOREACH(Ptr, decl, structDecls[nullptr]) { WriteHeader_Struct(writer, decl, nss, false); } writer.WriteLine(L""); } } if (classDecls.Keys().Contains(nullptr)) { FOREACH(Ptr, decl, classDecls[nullptr]) { WriteHeader_ClassPreDecl(writer, decl, nss); } writer.WriteLine(L""); if (multiFile) { vint index = headerFilesClasses.Keys().IndexOf(0); if (index != -1) { FOREACH(Ptr, decl, headerFilesClasses.GetByIndex(index)) { WriteHeader_Class(writer, decl, nss); writer.WriteLine(L""); } } } else { FOREACH(Ptr, decl, classDecls[nullptr]) { WriteHeader_Class(writer, decl, nss); writer.WriteLine(L""); } } } WriteNamespaceEnd(writer, nss); WriteHeader_Global(writer); writer.WriteLine(L""); WritePopCompileOptions(writer); } void WfCppConfig::WriteNonCustomSubHeader(stream::StreamWriter& writer, vint fileIndex) { WritePushCompileOptions(writer); writer.WriteLine(L""); List nss; if (classDecls.Keys().Contains(nullptr)) { vint index = headerFilesClasses.Keys().IndexOf(fileIndex); if (index != -1) { FOREACH(Ptr, decl, headerFilesClasses.GetByIndex(index)) { WriteHeader_Class(writer, decl, nss); writer.WriteLine(L""); } } } WriteNamespaceEnd(writer, nss); 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 nss; if (multiFile) { vint index = customFilesClasses.Keys().IndexOf(L""); if (index != -1) { FOREACH(Ptr, decl, customFilesClasses.GetByIndex(index)) { WriteCpp_Class(writer, decl, nss); } } } else { FOREACH(Ptr, decl, classDecls[nullptr]) { WriteCpp_Class(writer, decl, nss); } } WriteNamespaceEnd(writer, nss); } WriteCpp_PopMacros(writer); writer.WriteLine(L""); WritePopCompileOptions(writer); } void WfCppConfig::WriteSubHeader(stream::StreamWriter& writer, const WString& fileName) { WritePushCompileOptions(writer); writer.WriteLine(L""); List nss; FOREACH(Ptr, decl, customFilesClasses.Get(fileName)) { WriteHeader_Class(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""); if (From(customFilesClasses.Get(fileName)) .Any([=](Ptr decl) { return IsClassHasUserImplMethods(decl, true); })) { writer.WriteLine(L"/* USER_CONTENT_BEGIN(custom global declarations) */"); writer.WriteLine(L"/* USER_CONTENT_END() */"); writer.WriteLine(L""); } List nss; FOREACH(Ptr, decl, customFilesClasses.Get(fileName)) { WriteCpp_Class(writer, decl, nss); } WriteNamespaceEnd(writer, nss); WriteCpp_PopMacros(writer); writer.WriteLine(L""); WritePopCompileOptions(writer); } void WfCppConfig::WriteReflectionHeader(stream::StreamWriter& writer, bool multiFile) { WritePushCompileOptions(writer); if (manager->declarationTypes.Count() > 0) { writer.WriteLine(L""); WriteHeader_Reflection(writer); writer.WriteLine(L""); } WritePopCompileOptions(writer); } void WfCppConfig::WriteReflectionCpp(stream::StreamWriter& writer, bool multiFile) { WritePushCompileOptions(writer); if (manager->declarationTypes.Count() > 0) { writer.WriteLine(L""); WriteCpp_Reflection(writer); writer.WriteLine(L""); } WritePopCompileOptions(writer); } } } } /*********************************************************************** .\CPP\WFCPP_GENERATECPPFILES.CPP ***********************************************************************/ namespace vl { namespace workflow { namespace cppcodegen { using namespace stream; /*********************************************************************** WfCppInput ***********************************************************************/ WfCppInput::WfCppInput(const WString& _assemblyName) { headerGuardPrefix = L"VCZH_WORKFLOW_COMPILER_GENERATED_"; assemblyName = _assemblyName; assemblyNamespace = L"vl_workflow_global"; includeFileName = _assemblyName + L"Includes"; reflectionFileName = assemblyName + L"Reflection"; defaultFileName = _assemblyName; } /*********************************************************************** GenerateCppFiles ***********************************************************************/ 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"***********************************************************************/"); } void WriteReflectionInclude(bool reflection, Ptr input, stream::StreamWriter& writer) { if (reflection || input->reflectionIncludes.Count() > 0) { writer.WriteLine(L"/* CodePack:BeginIgnore() */"); writer.WriteLine(L"#ifndef VCZH_DEBUG_NO_REFLECTION"); if (reflection) { writer.WriteLine(L"/* CodePack:ConditionOff(VCZH_DEBUG_NO_REFLECTION, " + input->reflectionFileName + L".h) */"); writer.WriteLine(L"#include \"" + input->reflectionFileName + L".h\""); } else { FOREACH(WString, include, input->reflectionIncludes) { writer.WriteLine(L"/* CodePack:ConditionOff(VCZH_DEBUG_NO_REFLECTION, " + include + L") */"); writer.WriteLine(L"#include \"" + include + L"\""); } } writer.WriteLine(L"#endif"); writer.WriteLine(L"/* CodePack:EndIgnore() */"); } } void WriteDependedInclude(Ptr input, WfCppConfig& config, vint headerIndex, stream::StreamWriter& writer) { vint index = config.headerIncludes.Keys().IndexOf(headerIndex); if (index != -1) { const auto& headers = config.headerIncludes.GetByIndex(index); FOREACH(vint, header, headers) { if (header == 0) { writer.WriteLine(L"#include \"" + input->defaultFileName + L".h\""); } else if (header > 0) { writer.WriteLine(L"#include \"" + config.customFilesClasses.Keys()[header] + L".h\""); } else { writer.WriteLine(L"#include \"" + input->defaultFileName + itow(-header) + L".h\""); } } } } void WriteHeader(Ptr input, Ptr output, WfCppConfig& config, bool multiFile, bool reflection, stream::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"\""); } writer.WriteLine(L""); config.WriteHeader(writer, multiFile); writer.WriteLine(L""); writer.WriteLine(L"#endif"); } void WriteNonCustomSubHeader(Ptr input, Ptr output, WfCppConfig& config, bool multiFile, bool reflection, vint fileIndex, stream::StreamWriter& writer) { GenerateCppComment(writer, input->comment); writer.WriteLine(L""); writer.WriteLine(L"#ifndef " + input->headerGuardPrefix + wupper(input->defaultFileName) + L"_DP" + itow(fileIndex)); writer.WriteLine(L"#define " + input->headerGuardPrefix + wupper(input->defaultFileName) + L"_DP" + itow(fileIndex)); writer.WriteLine(L""); writer.WriteLine(L"#include \"" + input->defaultFileName + L".h\""); WriteDependedInclude(input, config, -fileIndex, writer); writer.WriteLine(L""); config.WriteNonCustomSubHeader(writer, fileIndex); writer.WriteLine(L""); writer.WriteLine(L"#endif"); } void WriteCpp(Ptr input, Ptr output, WfCppConfig& config, bool multiFile, bool reflection, stream::StreamWriter& writer) { GenerateCppComment(writer, input->comment); writer.WriteLine(L""); writer.WriteLine(L"#include \"" + output->entryFileName + L".h\""); WriteReflectionInclude(reflection, input, writer); writer.WriteLine(L""); config.WriteCpp(writer, multiFile); } void WriteReflectionHeader(Ptr input, Ptr output, WfCppConfig& config, bool multiFile, bool reflection, stream::StreamWriter& writer) { GenerateCppComment(writer, input->comment); writer.WriteLine(L""); writer.WriteLine(L"#ifndef " + input->headerGuardPrefix + wupper(input->reflectionFileName)); writer.WriteLine(L"#define " + input->headerGuardPrefix + wupper(input->reflectionFileName)); writer.WriteLine(L""); writer.WriteLine(L"#include \"" + output->entryFileName + L".h\""); 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.WriteReflectionHeader(writer, multiFile); writer.WriteLine(L""); writer.WriteLine(L"#endif"); } void WriteReflectionCpp(Ptr input, Ptr output, WfCppConfig& config, bool multiFile, bool reflection, stream::StreamWriter& writer) { GenerateCppComment(writer, input->comment); writer.WriteLine(L""); writer.WriteLine(L"#include \"" + input->reflectionFileName + L".h\""); writer.WriteLine(L""); config.WriteReflectionCpp(writer, multiFile); } void WriteIncludesHeader(Ptr input, Ptr output, WfCppConfig& config, bool multiFile, bool reflection, stream::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.customFilesClasses.Keys()) { if (fileName != L"") { writer.WriteLine(L"#include \"" + fileName + L".h\""); } } FOREACH(vint, fileIndex, config.headerFilesClasses.Keys()) { if (fileIndex != 0) { writer.WriteLine(L"#include \"" + input->defaultFileName + itow(fileIndex) + L".h\""); } } writer.WriteLine(L""); writer.WriteLine(L"#endif"); } void WriteSubHeader(Ptr input, Ptr output, WfCppConfig& config, bool multiFile, bool reflection, const WString& fileName, stream::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\""); WriteDependedInclude(input, config, config.customFilesClasses.Keys().IndexOf(fileName), writer); writer.WriteLine(L""); config.WriteSubHeader(writer, fileName); writer.WriteLine(L""); writer.WriteLine(L"#endif"); } void WriteSubCpp(Ptr input, Ptr output, WfCppConfig& config, bool multiFile, bool reflection, const WString& fileName, stream::StreamWriter& writer) { GenerateCppComment(writer, input->comment); writer.WriteLine(L""); writer.WriteLine(L"#include \"" + input->includeFileName + L".h\""); WriteReflectionInclude(reflection, input, writer); writer.WriteLine(L""); config.WriteSubCpp(writer, fileName); } Ptr GenerateCppFiles(Ptr input, analyzer::WfLexicalScopeManager* manager) { WfCppConfig config(manager, input->assemblyName, input->assemblyNamespace); if (manager->errors.Count() > 0) { return nullptr; } auto output = MakePtr(); if (config.manager->declarationTypes.Count() > 0) { output->containsReflectionInfo = true; } bool multiFile = false; switch (input->multiFile) { case WfCppFileSwitch::Enabled: multiFile = true; break; case WfCppFileSwitch::Disabled: multiFile = false; break; default: multiFile = config.customFilesClasses.Count() > 1; } bool reflection = false; switch (input->reflection) { case WfCppFileSwitch::Enabled: reflection = true; break; case WfCppFileSwitch::Disabled: reflection = false; break; default: reflection = config.manager->declarationTypes.Count() > 0; } output->multiFile = multiFile; output->reflection = reflection; if (multiFile) { output->entryFileName = input->includeFileName; } else { output->entryFileName = input->defaultFileName; } output->cppFiles.Add(input->defaultFileName + L".h", GenerateToStream([&](StreamWriter& writer) { WriteHeader(input, output, config, multiFile, reflection, writer); })); FOREACH(vint, fileIndex, config.headerFilesClasses.Keys()) { if (fileIndex != 0) { output->cppFiles.Add(input->defaultFileName + itow(fileIndex) + L".h", GenerateToStream([&](StreamWriter& writer) { WriteNonCustomSubHeader(input, output, config, multiFile, reflection, fileIndex, writer); })); } } output->cppFiles.Add(input->defaultFileName + L".cpp", GenerateToStream([&](StreamWriter& writer) { WriteCpp(input, output, config, multiFile, reflection, writer); })); if (reflection) { output->cppFiles.Add(input->reflectionFileName + L".h", GenerateToStream([&](StreamWriter& writer) { WriteReflectionHeader(input, output, config, multiFile, reflection, writer); })); output->cppFiles.Add(input->reflectionFileName + L".cpp", GenerateToStream([&](StreamWriter& writer) { WriteReflectionCpp(input, output, config, multiFile, reflection, writer); })); } if (multiFile) { output->cppFiles.Add(input->includeFileName + L".h", GenerateToStream([&](StreamWriter& writer) { WriteIncludesHeader(input, output, config, multiFile, reflection, writer); })); FOREACH(WString, fileName, config.customFilesClasses.Keys()) { if (fileName != L"") { output->cppFiles.Add(fileName + L".h", GenerateToStream([&](StreamWriter& writer) { WriteSubHeader(input, output, config, multiFile, reflection, fileName, writer); })); output->cppFiles.Add(fileName + L".cpp", GenerateToStream([&](StreamWriter& writer) { WriteSubCpp(input, output, config, multiFile, reflection, fileName, writer); })); } } } return output; } } } } /*********************************************************************** .\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; stream::StreamWriter& writer; WString prefixBlock; WString prefix; ITypeInfo* returnType; WfGenerateStatementVisitor(WfCppConfig* _config, Ptr _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 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(); 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::CreateTypeInfo().Obj()); } writer.WriteLine(L")"); Call(node->trueBranch); if (node->falseBranch) { writer.WriteString(prefix); if (auto ifStat = node->falseBranch.Cast()) { 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::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::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"{"); auto oldPrefix = prefix; if (node->endLabel.value != L"") { auto name = config->ConvertName(node->endLabel.value, L"__vwsnl_" + itow(functionRecord->labelCounter++) + L"_"); functionRecord->labelNames.Add(node->endLabel.value, name); writer.WriteString(prefixBlock); writer.WriteLine(L"\t{"); prefix += L"\t"; } FOREACH(Ptr, statement, node->statements) { statement = SearchUntilNonVirtualStatement(statement); if (statement.Cast()) { Call(statement); } else { Call(statement, WString::Empty); } } if (node->endLabel.value != L"") { prefix = oldPrefix; writer.WriteString(prefixBlock); writer.WriteLine(L"\t}"); writer.WriteString(prefixBlock); writer.WriteString(L"\t"); writer.WriteString(functionRecord->labelNames[node->endLabel.value]); writer.WriteLine(L":;"); functionRecord->labelNames.Remove(node->endLabel.value); } writer.WriteString(prefixBlock); writer.WriteLine(L"}"); } void Visit(WfGotoStatement* node)override { writer.WriteString(prefix); writer.WriteString(L"goto "); writer.WriteString(functionRecord->labelNames[node->label.value]); 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(WfVirtualCseStatement* 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 Visit(WfStateMachineStatement* node)override { CHECK_FAIL(L"WfGenerateStatementVisitor::Visit(WfStateMachineStatement*)#Internal error, All state machine statements do not generate C++ code."); } }; void GenerateStatement(WfCppConfig* config, Ptr functionRecord, stream::StreamWriter& writer, Ptr 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 decl, const WString& name, const WString& prefix) { writer.WriteLine(prefix + L"class " + name + L";"); } void WfCppConfig::WriteHeader_ClassPreDecl(stream::StreamWriter& writer, Ptr decl, collections::List& 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>& unprocessed; WriteHeader_Class_FindClassDeclVisitor(List>& _unprocessed) :unprocessed(_unprocessed) { } void Dispatch(WfVirtualCseDeclaration* node)override { FOREACH(Ptr, decl, node->expandedDeclarations) { decl->Accept(this); } } void Dispatch(WfVirtualCfeDeclaration* node)override { FOREACH(Ptr, decl, node->expandedDeclarations) { decl->Accept(this); } } void Visit(WfClassDeclaration* node)override { unprocessed.Add(node); } }; void WfCppConfig::WriteHeader_Class(stream::StreamWriter& writer, Ptr 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(0, count) .Any([=](vint index) { auto baseTd = td->GetBaseTypeDescriptor(index); return baseTd->GetTypeDescriptorFlags() == TypeDescriptorFlags::Class && baseTd != description::GetTypeDescriptor(); }); 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()) { 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> unprocessed; unprocessed.Add(decl); FOREACH(Ptr, attribute, attributeEvaluator->GetAttributes(decl->attributes, L"cpp", L"Friend")) { auto attValue = attributeEvaluator->GetAttributeValue(attribute); CHECK_ERROR(attValue.type == runtime::WfInsType::Unknown && attValue.typeDescriptor != nullptr, L"Unexpected value in attribute: @cpp.Friend."); auto td = attValue.typeDescriptor; 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(); 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 closureNames; CopyFrom( closureNames, From(classClosures.GetByIndex(index)) .Select([&](Ptr closure) { return (closure.Cast() ? 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, memberDecl, current->declarations) { memberDecl->Accept(&visitor); } } } writer.WriteLine(L"#ifdef VCZH_DESCRIPTABLEOBJECT_WITH_METADATA"); 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, decl, enumDecls.GetByIndex(index)) { WriteHeader_Enum(writer, decl, ConvertName(decl->name.value), prefix + L"\t", false); 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, decl, structDecls.GetByIndex(index)) { WriteHeader_Struct(writer, decl, ConvertName(decl->name.value), prefix + L"\t", false); 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, decl, classDecls.GetByIndex(index)) { WriteHeader_ClassPreDecl(writer, decl, ConvertName(decl->name.value), prefix + L"\t"); } writer.WriteLine(L""); FOREACH(Ptr, decl, classDecls.GetByIndex(index)) { WriteHeader_Class(writer, decl, ConvertName(decl->name.value), prefix + L"\t"); } } } FOREACH(Ptr, 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); } if (IsClassHasUserImplMethods(decl, false)) { auto td = manager->declarationTypes[decl.Obj()].Obj(); auto classFullName = CppGetFullName(td); writer.WriteLine(L""); writer.WriteLine(prefix + L"/* USER_CONTENT_BEGIN(custom members of " + classFullName + L") */"); writer.WriteLine(prefix + L"/* USER_CONTENT_END() */"); } writer.WriteLine(prefix + L"};"); } WString WfCppConfig::WriteHeader_Class(stream::StreamWriter& writer, Ptr decl, collections::List& 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; } bool WfCppConfig::WriteCpp_ClassMember(stream::StreamWriter& writer, Ptr decl, Ptr memberDecl, collections::List& nss) { List 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, decl.Obj(), GetClassBaseName(decl), ConvertName(decl->name.value), classFullName, memberDecl, prefix); } void WfCppConfig::WriteCpp_Class(stream::StreamWriter& writer, Ptr decl, collections::List& nss) { List> 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, 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 decl, const WString& name, const WString& prefix, bool mainHeaderDefinition) { if (mainHeaderDefinition) { writer.WriteLine(prefix + L"enum class " + name + L" : vl::vuint64_t"); writer.WriteLine(prefix + L"{"); FOREACH(Ptr, 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, enumInt, index, item->intersections) { if (index > 0) { writer.WriteString(L" | "); } writer.WriteString(ConvertName(enumInt->name.value)); } writer.WriteLine(L","); break; } } writer.WriteLine(prefix + L"};"); } else { auto td = manager->declarationTypes[decl.Obj()].Obj(); writer.WriteString(prefix); writer.WriteString(L"using "); writer.WriteString(name); writer.WriteString(L" = ::"); writer.WriteString(CppNameToHeaderEnumStructName(CppGetFullName(td), L"enum")); writer.WriteLine(L";"); } } void WfCppConfig::WriteHeader_EnumOp(stream::StreamWriter& writer, Ptr 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 decl, collections::List& nss, bool mainHeaderDefinition) { auto td = manager->declarationTypes[decl.Obj()].Obj(); if (mainHeaderDefinition) { WString name; auto prefix = WriteNamespace(writer, CppNameToHeaderEnumStructName(CppGetFullName(td), L"enum"), nss, name); WriteHeader_Enum(writer, decl, name, prefix, true); WriteHeader_EnumOp(writer, decl, name, prefix); } else { WString name; auto prefix = WriteNamespace(writer, CppGetFullName(td), nss, name); writer.WriteString(prefix); writer.WriteString(L"using "); writer.WriteString(name); writer.WriteString(L" = ::"); writer.WriteString(CppNameToHeaderEnumStructName(CppGetFullName(td), L"enum")); writer.WriteLine(L";"); } } void WfCppConfig::WriteHeader_MainHeaderEnums(stream::StreamWriter& writer, collections::List& nss) { List> allEnums; CopyFrom(allEnums, Range(0, enumDecls.Count()).SelectMany([&](vint index) {return From(enumDecls.GetByIndex(index)); })); SortDeclsByName(allEnums); FOREACH(Ptr, decl, allEnums) { WriteHeader_Enum(writer, decl, nss, true); writer.WriteLine(L""); } } } } } /*********************************************************************** .\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& 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 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 arguments; CopyFrom( arguments, Range(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 funcExpr, const WString& name, bool writeReturnType) { auto result = manager->expressionResolvings[funcExpr.Obj()]; auto typeInfo = result.type.Obj(); List arguments; CopyFrom( arguments, From(funcExpr->function->arguments) .Select([](Ptr argument) { return argument->name.value; }) ); return WriteFunctionHeader(writer, typeInfo, arguments, name, writeReturnType); } ITypeInfo* WfCppConfig::WriteFunctionHeader(stream::StreamWriter& writer, Ptr 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(manager->declarationMemberInfos.Values()[index1].Obj()) : index2 != -1 ? manager->interfaceMethodImpls.Values()[index2] : nullptr; List arguments; CopyFrom( arguments, From(decl->arguments) .Select([](Ptr 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& 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 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>& reversedLambdaExprs, Dictionary>& reversedClassExprs) { CopyFrom( reversedLambdaExprs, From(lambdaExprs) .Select([](Pair, WString> pair) { return Pair>(pair.value, pair.key); }) ); CopyFrom( reversedClassExprs, From(classExprs) .Select([](Pair, WString> pair) { return Pair>(pair.value, pair.key); }) ); } void WfCppConfig::WriteHeader_Global(stream::StreamWriter& writer) { Dictionary> reversedLambdaExprs; Dictionary> 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, 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, 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, expr, reversedLambdaExprs.Values()) { writer.WriteLine(L""); WriteHeader_LambdaExprDecl(writer, expr); } FOREACH(Ptr, expr, reversedClassExprs.Values()) { writer.WriteLine(L""); WriteHeader_ClassExprDecl(writer, expr); } } writer.WriteLine(L"}"); } void WfCppConfig::WriteCpp_Global(stream::StreamWriter& writer) { Dictionary> reversedLambdaExprs; Dictionary> 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, 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, 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()) { writer.WriteLine(L"\t\tinstance." + ConvertName(decl->name.value) + L" = ::vl::WString::Empty;"); } else if (typeInfo->GetTypeDescriptor() == description::GetTypeDescriptor()) { 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, 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, 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, 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::WriteCpp ***********************************************************************/ void WfCppConfig::WriteHeader_ClosurePreDecl(stream::StreamWriter& writer, Ptr closure) { auto info = closureInfos[closure.Obj()]; writer.WriteString(L"\t"); if (closure.Cast()) { writer.WriteString(L"class "); } else { writer.WriteString(L"struct "); } writer.WriteString(info->lambdaClassName); writer.WriteLine(L";"); } void WfCppConfig::WriteHeader_LambdaExprDecl(stream::StreamWriter& writer, Ptr lambda) { if (auto ordered = lambda.Cast()) { 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()) { 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 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, memberDecl, lambda->declarations) { GenerateClassMemberDecl(this, writer, name, memberDecl, L"\t\t", true); } writer.WriteLine(L"\t};"); } bool WfCppConfig::WriteCpp_ClosureMembers(stream::StreamWriter& writer, Ptr closure) { auto info = closureInfos[closure.Obj()]; FOREACH(Ptr, 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(MakePtr(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 closure, const WString& name) { auto info = closureInfos[closure.Obj()]; writer.WriteString(name); writer.WriteString(L"("); vint argumentIndex = 0; FOREACH_INDEXER(Ptr, 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(MakePtr(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 closure) { auto info = closureInfos[closure.Obj()]; FOREACH_INDEXER(Ptr, 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"(::vl::__vwsn::This(__vwsnctorthis_" + itow(index)); writer.WriteLine(L"))"); } } void WfCppConfig::WriteCpp_LambdaExprImpl(stream::StreamWriter& writer, Ptr lambda) { if (auto ordered = lambda.Cast()) { 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()) { 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(WfVirtualCfeDeclaration* node)override { FOREACH(Ptr, decl, node->expandedDeclarations) { decl->Accept(this); } } void Dispatch(WfVirtualCseDeclaration* node)override { FOREACH(Ptr, 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 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, memberDecl, lambda->declarations) { memberDecl->Accept(&visitor); } } writer.WriteLine(L"\t}"); writer.WriteLine(L""); WString classFullName = L"::" + assemblyNamespace + L"::" + name; FOREACH(Ptr, memberDecl, lambda->declarations) { if (GenerateClassMemberImpl(this, writer, nullptr, 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& tds) { CopyFrom( tds, From(config->manager->declarationTypes.Values()) .OrderBy([](Ptr a, Ptr b) { return WString::Compare(a->GetTypeName(), b->GetTypeName()); }) .Select([](Ptr 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 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 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(0, td->GetBaseTypeDescriptorCount()) .All([&](vint baseIndex) { return tdInterfaces.IndexOf(td->GetBaseTypeDescriptor(baseIndex)) < processed; })) { tdInterfaces.RemoveAt(i); tdInterfaces.Insert(processed++, td); } } } } if (tdInterfaces.Count() > 0) { writer.WriteLine(L""); writer.WriteLine(L"#ifdef VCZH_DESCRIPTABLEOBJECT_WITH_METADATA"); FOREACH(ITypeDescriptor*, td, tdInterfaces) { List baseTds; CopyFrom( baseTds, Range(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()) { 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"#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 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"#ifdef VCZH_DESCRIPTABLEOBJECT_WITH_METADATA"); 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")"); vint baseCount = td->GetBaseTypeDescriptorCount(); for (vint i = 0; i < baseCount; i++) { writer.WriteString(L"\t\t\t\tCLASS_MEMBER_BASE("); writer.WriteString(ConvertType(td->GetBaseTypeDescriptor(i))); 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"#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"#ifdef VCZH_DESCRIPTABLEOBJECT_WITH_METADATA"); 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 decl, const WString& name, const WString& prefix, bool mainHeaderDefinition) { if (mainHeaderDefinition) { auto td = manager->declarationTypes[decl.Obj()].Obj(); writer.WriteLine(prefix + L"struct " + name); writer.WriteLine(prefix + L"{"); FOREACH(Ptr, 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(), true) + L" " + ConvertName(member->name.value) + defaultValue + L";"); } writer.WriteLine(prefix + L"};"); } else { auto td = manager->declarationTypes[decl.Obj()].Obj(); writer.WriteString(prefix); writer.WriteString(L"using "); writer.WriteString(name); writer.WriteString(L" = ::"); writer.WriteString(CppNameToHeaderEnumStructName(CppGetFullName(td), L"struct")); writer.WriteLine(L";"); } } void WfCppConfig::WriteHeader_StructOp(stream::StreamWriter& writer, Ptr decl, const WString& name, const WString& prefix) { using opt = Tuple; 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, 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 decl, collections::List& nss, bool mainHeaderDefinition) { auto td = manager->declarationTypes[decl.Obj()].Obj(); if (mainHeaderDefinition) { WString name; auto prefix = WriteNamespace(writer, CppNameToHeaderEnumStructName(CppGetFullName(td), L"struct"), nss, name); WriteHeader_Struct(writer, decl, name, prefix, true); WriteHeader_StructOp(writer, decl, name, prefix); } else { WString name; auto prefix = WriteNamespace(writer, CppGetFullName(td), nss, name); writer.WriteString(prefix); writer.WriteString(L"using "); writer.WriteString(name); writer.WriteString(L" = ::"); writer.WriteString(CppNameToHeaderEnumStructName(CppGetFullName(td), L"struct")); writer.WriteLine(L";"); } } void WfCppConfig::WriteHeader_MainHeaderStructs(stream::StreamWriter& writer, collections::List& nss) { List> allStructs; CopyFrom(allStructs, Range(0, structDecls.Count()).SelectMany([&](vint index) {return From(structDecls.GetByIndex(index)); })); SortDeclsByName(allStructs); Group, Ptr> depGroup; FOREACH(Ptr, decl, allStructs) { auto td = manager->declarationTypes[decl.Obj()].Obj(); vint count = td->GetPropertyCount(); for (vint i = 0; i < count; i++) { auto propType = td->GetProperty(i)->GetReturn(); if (propType->GetDecorator() == ITypeInfo::TypeDescriptor) { auto propTd = propType->GetTypeDescriptor(); vint index = tdDecls.Keys().IndexOf(propTd); if (index != -1) { depGroup.Add(decl, tdDecls.Values()[index].Cast()); } } } } PartialOrderingProcessor pop; pop.InitWithGroup(allStructs, depGroup); pop.Sort(); for (vint i = 0; i < pop.components.Count(); i++) { auto& component = pop.components[i]; CHECK_ERROR(component.nodeCount == 1, L"WfCppConfig::WriteHeader_MainHeaderStructs(StreamWriter&, List&)#Internal error: Unexpected circle dependency found, which should be cought by the Workflow semantic analyzer."); auto decl = allStructs[component.firstNode[0]]; WriteHeader_Struct(writer, decl, nss, true); writer.WriteLine(L""); } } } } } /*********************************************************************** .\CPP\WFMERGECPP.CPP ***********************************************************************/ namespace vl { namespace workflow { namespace cppcodegen { using namespace collections; using namespace stream; using namespace regex; /*********************************************************************** MergeCpp ***********************************************************************/ 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 USER_CONTENT = 4; const vint UNUSED_USER_CONTENT = 5; template void ProcessCppContent(const WString& code, const TCallback& callback) { Regex regexUserContentBegin(L"/.*?(?/{)?///* USER_CONTENT_BEGIN/(([^)]*?)/) /*//"); vint state = NORMAL; vint counter = 0; WString previousContent; 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 (auto match = regexUserContentBegin.MatchHead(content)) { content = L"USERIMPL(/* " + match->Groups()[L"name"][0].Value() + L" */)"; if (match->Captures().Count() > 0) { content += previousContent; } state = USER_CONTENT; } else if (INVLOC.StartsWith(content, L"USERIMPL(",Locale::None)) { state = WAIT_HEADER; } break; case WAIT_HEADER: state = WAIT_OPEN; break; case WAIT_OPEN: if (INVLOC.StartsWith(content, L"{", Locale::None)) { state = WAIT_CLOSE; } break; case WAIT_CLOSE: if (INVLOC.StartsWith(content, L"{", Locale::None)) { counter++; } else if (INVLOC.StartsWith(content, L"}", Locale::None)) { if (counter == 0) { state = NORMAL; } else { counter--; } } break; case USER_CONTENT: if (INVLOC.EndsWith(content, L"/* USER_CONTENT_END() */", Locale::None)) { state = NORMAL; } break; } callback(previousState, state, line, content); } previousContent = RemoveSpacePrefix(line); } } template void SplitCppContent(const WString& code, Dictionary& userContents, Dictionary& 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 { switch (previousState) { case NORMAL: switch (state) { case WAIT_HEADER: case USER_CONTENT: name = content; userImpl = L""; userImplFull = L""; break; } break; case WAIT_HEADER: name += content; break; case WAIT_CLOSE: case USER_CONTENT: switch (state) { case WAIT_CLOSE: case USER_CONTENT: userImpl += line + L"\r\n"; break; case NORMAL: userImplFull += L"//" + line + L"\r\n"; userContents.Add(name, userImpl); userContentsFull.Add(name, userImplFull); name = L""; break; } break; } if (name != L"") { userImplFull += L"//" + line + L"\r\n"; } } }); } MergeCppMultiPlatformException::MergeCppMultiPlatformException(vint _row32, vint _column32, vint _row64, vint _column64) :Exception(L"The difference at " L"x86 file(row:" + itow(_row32 + 1) + L", column:" + itow(_column32 + 1) + L") and " L"x64 file(row:" + itow(_row64 + 1) + L", column:" + itow(_column64 + 1) + L") are not " L"\"vint32_t\" and \"vint64_t\", " L"\"vuint32_t\" and \"vuint64_t\", " L"\"\" and \"L\", " L"\"\" and \"UL\".") , row32(_row32) , column32(_column32) , row64(_row64) , column64(_column64) { } void CountRowAndColumn(const wchar_t* start, const wchar_t* reading, vint& row, vint& column) { row = 0; column = 0; while (start < reading) { if (*start++ == L'\n') { row++; column = 0; } else { column++; } } } WString MergeCppMultiPlatform(const WString& code32, const WString& code64) { static wchar_t stringCast32[] = L"static_cast<::vl::vint32_t>("; const vint lengthCast32 = sizeof(stringCast32) / sizeof(*stringCast32) - 1; static wchar_t stringCast64[] = L"static_cast<::vl::vint64_t>("; const vint lengthCast64 = sizeof(stringCast64) / sizeof(*stringCast64) - 1; return GenerateToStream([&](StreamWriter& writer) { const wchar_t* reading32 = code32.Buffer(); const wchar_t* reading64 = code64.Buffer(); const wchar_t* start32 = reading32; const wchar_t* start64 = reading64; while (true) { vint length = 0; while (reading32[length] && reading64[length]) { if (reading32[length] == reading64[length]) { length++; } else { break; } } writer.WriteString(reading32, length); reading32 += length; reading64 += length; if (*reading32 == 0 && *reading64 == 0) { break; } #define IS_DIGIT(C) (L'0' <= C && C <= L'9') if (reading32[0] == L'3' && reading32[1] == L'2' && reading64[0] == L'6' && reading64[1] == L'4') { if (length >= 4) { if (wcsncmp(reading32 - 4, L"vint32_t", 8) == 0 && wcsncmp(reading64 - 4, L"vint64_t", 8) == 0) { reading32 += 4; reading64 += 4; goto NEXT_ROUND; } } if (length >= 5) { if (wcsncmp(reading32 - 5, L"vuint32_t", 9) == 0 && wcsncmp(reading64 - 5, L"vuint64_t", 9) == 0) { reading32 += 4; reading64 += 4; goto NEXT_ROUND; } } } else if (reading64[0] == L'L') { if (reading32[0] == reading64[1] && length >= 1) { if (IS_DIGIT(reading32[-1]) && !IS_DIGIT(reading32[0])) { if (IS_DIGIT(reading64[-1]) && !IS_DIGIT(reading64[1])) { reading64 += 1; goto NEXT_ROUND; } } } } else if (reading64[0] == L'U' && reading64[1] == L'L') { if (reading32[0] == reading64[2] && length >= 1) { if (IS_DIGIT(reading32[-1]) && !IS_DIGIT(reading32[0])) { if (IS_DIGIT(reading64[-1]) && !IS_DIGIT(reading64[2])) { reading64 += 2; goto NEXT_ROUND; } } } } else if (wcsncmp(reading32, stringCast32, lengthCast32) == 0 && IS_DIGIT(reading32[lengthCast32]) && IS_DIGIT(reading64[0])) { reading32 += lengthCast32; vint digitCount = 0; while (IS_DIGIT(reading32[digitCount])) digitCount++; if (wcsncmp(reading32, reading64, digitCount) == 0 && reading64[digitCount] == L'L' && reading32[digitCount] == L')') { writer.WriteString(L"static_cast<::vl::vint>("); writer.WriteString(WString(reading32, digitCount)); writer.WriteChar(L')'); reading64 += digitCount + 1; reading32 += digitCount + 1; goto NEXT_ROUND; } } else if (wcsncmp(reading64, stringCast64, lengthCast64) == 0 && IS_DIGIT(reading64[lengthCast64]) && IS_DIGIT(reading32[0])) { reading64 += lengthCast64; vint digitCount = 0; while (IS_DIGIT(reading64[digitCount])) digitCount++; if (wcsncmp(reading64, reading32, digitCount) == 0 && reading64[digitCount] == L'L' && reading64[digitCount + 1] == L')') { writer.WriteString(L"static_cast<::vl::vint>("); writer.WriteString(WString(reading64, digitCount)); writer.WriteChar(L')'); reading64 += digitCount + 2; reading32 += digitCount; goto NEXT_ROUND; } } { vint row32 = 0; vint column32 = 0; vint row64 = 0; vint column64 = 0; CountRowAndColumn(start32, reading32, row32, column32); CountRowAndColumn(start64, reading64, row64, column64); throw MergeCppMultiPlatformException(row32, column32, row64, column64); } NEXT_ROUND:; #undef IS_DIGIT } }); } WString MergeCppFileContent(const WString& dst, const WString& src) { Dictionary 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) { switch (previousState) { case NORMAL: switch (state) { case WAIT_HEADER: case USER_CONTENT: name = content; userImpl = L""; break; } break; case WAIT_HEADER: name += content; break; case WAIT_CLOSE: case USER_CONTENT: switch (state) { case WAIT_CLOSE: case USER_CONTENT: userImpl += line + L"\r\n"; return; case NORMAL: { vint index = userContents.Keys().IndexOf(name); if (index == -1) { writer.WriteString(userImpl); } else { writer.WriteString(userContents.Values()[index]); userContentsFull.Remove(name); } } break; } break; } writer.WriteLine(line); }); if (userContentsFull.Count() > 0) { writer.WriteLine(L"// UNUSED_USER_CONTENT:"); FOREACH(WString, content, userContentsFull.Values()) { writer.WriteString(content); } } }); } } } } /*********************************************************************** .\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 WfAttributeEvaluator::GetAttribute(collections::List>& atts, const WString& category, const WString& name) { return From(GetAttributes(atts, category, name)).First(nullptr); } collections::LazyList> WfAttributeEvaluator::GetAttributes(collections::List>& atts, const WString& category, const WString& name) { return From(atts) .Where([=](Ptr att) { return att->category.value == category && att->name.value == name; }); } runtime::WfRuntimeValue WfAttributeEvaluator::GetAttributeValue(Ptr att) { if (!att->value) { return {}; } { vint index = attributeValues.Keys().IndexOf(att.Obj()); if (index != -1) { return attributeValues.Values()[index]; } } auto attributeAssembly = MakePtr(); WfCodegenContext context(attributeAssembly, manager); auto typeInfo = manager->attributes[{att->category.value, att->name.value}]; GenerateExpressionInstructions(context, att->value, typeInfo); CHECK_ERROR(attributeAssembly->instructions.Count() == 1, L"WfAttributeEvaluator::GetAttributeValue(Ptr)#Internal error, attribute argument generates unexpected instructions."); auto& ins = attributeAssembly->instructions[0]; CHECK_ERROR(ins.code == WfInsCode::LoadValue, L"WfAttributeEvaluator::GetAttributeValue(Ptr)#Internal error, attribute argument generates unexpected instructions."); attributeValues.Add(att, ins.valueParameter); return ins.valueParameter; } /*********************************************************************** WfCodegenFunctionContext ***********************************************************************/ WfCodegenFunctionContext::WfCodegenFunctionContext() { scopeContextStack.Add(new WfCodegenScopeContext); } Ptr WfCodegenFunctionContext::GetCurrentScopeContext() { return scopeContextStack[scopeContextStack.Count() - 1]; } Ptr WfCodegenFunctionContext::GetCurrentScopeContext(WfCodegenScopeType type, const WString& name) { for (vint i = scopeContextStack.Count() - 1; i >= 0; i--) { auto context = scopeContextStack[i]; if (context->type == type) { if (name == L"" || context->name == name) { return context; } } } return 0; } Ptr WfCodegenFunctionContext::PushScopeContext(WfCodegenScopeType type, const WString& name) { auto context = MakePtr(); context->type = type; context->name = name; scopeContextStack.Add(context); return context; } void WfCodegenFunctionContext::PopScopeContext() { scopeContextStack.RemoveAt(scopeContextStack.Count() - 1); } /*********************************************************************** WfCodegenContext ***********************************************************************/ WfCodegenContext::WfCodegenContext(Ptr _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 (assembly->insBeforeCodegen && assembly->insAfterCodegen) { 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 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 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) #define FILL_LABEL_TO_INS(LABEL, INS) context.assembly->instructions[LABEL].indexParameter = INS #define FILL_LABEL_TO_CURRENT(LABEL) FILL_LABEL_TO_INS(LABEL, context.assembly->instructions.Count()) /*********************************************************************** GenerateTypeCastInstructions ***********************************************************************/ void GenerateTypeCastInstructions(WfCodegenContext& context, Ptr expectedType, bool strongCast, WfExpression* node) { if (expectedType->GetTypeDescriptor() != GetTypeDescriptor()) { vint fillElseIndex = -1; vint fillEndIndex = -1; if (expectedType->GetDecorator() == ITypeInfo::Nullable) { INSTRUCTION(Ins::Duplicate(0)); INSTRUCTION(Ins::LoadValue({})); INSTRUCTION(Ins::CompareReference()); fillElseIndex = INSTRUCTION(Ins::JumpIf(-1)); } 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; } } if (fillElseIndex != -1) { fillEndIndex = INSTRUCTION(Ins::Jump(-1)); FILL_LABEL_TO_CURRENT(fillElseIndex); INSTRUCTION(Ins::LoadValue({})); FILL_LABEL_TO_CURRENT(fillEndIndex); } } } /*********************************************************************** GetInstructionTypeArgument ***********************************************************************/ void GenerateTypeTestingInstructions(WfCodegenContext& context, Ptr expectedType, WfExpression* node) { if (expectedType->GetTypeDescriptor() != GetTypeDescriptor()) { 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({ true })); } } /*********************************************************************** GetInstructionTypeArgument ***********************************************************************/ runtime::WfInsType GetInstructionTypeArgument(Ptr expectedType) { auto td = expectedType->GetTypeDescriptor(); if (td == GetTypeDescriptor()) return WfInsType::Bool; if (td == GetTypeDescriptor()) return WfInsType::I1; if (td == GetTypeDescriptor()) return WfInsType::I2; if (td == GetTypeDescriptor()) return WfInsType::I4; if (td == GetTypeDescriptor()) return WfInsType::I8; if (td == GetTypeDescriptor()) return WfInsType::U1; if (td == GetTypeDescriptor()) return WfInsType::U2; if (td == GetTypeDescriptor()) return WfInsType::U4; if (td == GetTypeDescriptor()) return WfInsType::U8; if (td == GetTypeDescriptor()) return WfInsType::F4; if (td == GetTypeDescriptor()) return WfInsType::F8; if (td == GetTypeDescriptor()) return WfInsType::String; return WfInsType::Unknown; } /*********************************************************************** GenerateAssembly ***********************************************************************/ #define EXECUTE_CALLBACK(EXPR) if (callback) callback->EXPR Ptr GenerateAssembly(analyzer::WfLexicalScopeManager* manager, IWfCompilerCallback* callback) { EXECUTE_CALLBACK(OnGenerateMetadata()); auto assembly = MakePtr(); assembly->insBeforeCodegen = new WfInstructionDebugInfo; assembly->insAfterCodegen = new WfInstructionDebugInfo; WfCodegenContext context(assembly, manager); FOREACH_INDEXER(Ptr, 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, td, manager->declarationTypes.Values()) { if (auto tdClass = td.Cast()) { assembly->typeImpl->classes.Add(tdClass); } else if (auto tdInterface = td.Cast()) { assembly->typeImpl->interfaces.Add(tdInterface); } else if (auto tdStruct = td.Cast()) { assembly->typeImpl->structs.Add(tdStruct); } else if (auto tdEnum = td.Cast()) { assembly->typeImpl->enums.Add(tdEnum); } } } FOREACH(Ptr, module, manager->GetModules()) { FOREACH(Ptr, decl, module->declarations) { GenerateGlobalDeclarationMetadata(context, decl); } } { auto meta = MakePtr(); meta->name = L""; vint functionIndex = assembly->functions.Add(meta); assembly->functionByName.Add(meta->name, functionIndex); auto functionContext = MakePtr(); functionContext->function = meta; context.functionContext = functionContext; meta->firstInstruction = assembly->instructions.Count(); FOREACH(Ptr, module, manager->GetModules()) { FOREACH(Ptr, decl, module->declarations) { GenerateInitializeInstructions(context, decl); } } // define node for INSTRUCTION parsing::ParsingTreeCustomBase* node = nullptr; INSTRUCTION(Ins::LoadValue({})); INSTRUCTION(Ins::Return()); meta->lastInstruction = assembly->instructions.Count() - 1; context.functionContext = 0; GenerateClosureInstructions(context, functionContext); } FOREACH(Ptr, module, manager->GetModules()) { EXECUTE_CALLBACK(OnGenerateCode(module)); FOREACH(Ptr, decl, module->declarations) { GenerateDeclarationInstructions(context, decl); } } EXECUTE_CALLBACK(OnGenerateDebugInfo()); assembly->Initialize(); return assembly; } #undef EXECUTE_CALLBACK #undef FILL_LABEL_TO_CURRENT #undef FILL_LABEL_TO_INS #undef INSTRUCTION /*********************************************************************** Compile ***********************************************************************/ Ptr Compile(Ptr table, analyzer::WfLexicalScopeManager* manager, collections::List& moduleCodes, collections::List>& 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 Compile(Ptr table, collections::List& moduleCodes, collections::List>& 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, 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(WfVirtualCfeDeclaration* node)override { FOREACH(Ptr, decl, node->expandedDeclarations) { decl->Accept(this); } } void Visit(WfVirtualCseDeclaration* node)override { FOREACH(Ptr, decl, node->expandedDeclarations) { decl->Accept(this); } } }; void GenerateInitializeInstructions(WfCodegenContext& context, Ptr declaration) { GenerateInitializeInstructionsVisitor visitor(context); declaration->Accept(&visitor); } /*********************************************************************** GenerateInstructions(Declaration) ***********************************************************************/ Ptr GenerateFunctionInstructions_Prolog(WfCodegenContext& context, WfLexicalScope* scope, Ptr meta, Ptr returnType, Ptr recursiveLambdaSymbol, const List>& argumentSymbols, const List>& capturedSymbols, ParsingTreeCustomBase* node) { auto functionContext = MakePtr(); functionContext->function = meta; context.functionContext = functionContext; { FOREACH_INDEXER(Ptr, argumentSymbol, index, argumentSymbols) { functionContext->arguments.Add(argumentSymbol.Obj(), index); } FOREACH_INDEXER(Ptr, capturedSymbol, index, capturedSymbols) { functionContext->capturedVariables.Add(capturedSymbol.Obj(), index); } } if (recursiveLambdaSymbol) { vint variableIndex = meta->argumentNames.Count() + meta->localVariableNames.Add(L"" + 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 meta, Ptr returnType, Ptr recursiveLambdaSymbol, const List>& argumentSymbols, const List>& capturedSymbols, Ptr functionContext, ParsingTreeCustomBase* node) { INSTRUCTION(Ins::LoadValue({})); INSTRUCTION(Ins::Return()); meta->lastInstruction = context.assembly->instructions.Count() - 1; context.functionContext = 0; GenerateClosureInstructions(context, functionContext); } void GenerateFunctionInstructions(WfCodegenContext& context, WfLexicalScope* scope, Ptr meta, Ptr returnType, Ptr recursiveLambdaSymbol, const List>& argumentSymbols, const List>& capturedSymbols, Ptr 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 meta, Ptr returnType, Ptr recursiveLambdaSymbol, const List>& argumentSymbols, const List>& capturedSymbols, Ptr 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 meta, Ptr recursiveLambdaSymbol) { List> argumentSymbols, capturedSymbols; { FOREACH(Ptr, 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, 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 classDecl; GenerateClassMemberInstructionsVisitor(WfCodegenContext& _context, Ptr _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(WfVirtualCfeDeclaration* node)override { FOREACH(Ptr, decl, node->expandedDeclarations) { decl->Accept(this); } } void Dispatch(WfVirtualCseDeclaration* node)override { FOREACH(Ptr, decl, node->expandedDeclarations) { decl->Accept(this); } } void Visit(WfVariableDeclaration* node)override { auto info = context.manager->declarationMemberInfos[node].Cast().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(); functionContext->function = meta; context.functionContext = functionContext; meta->firstInstruction = context.assembly->instructions.Count(); auto scope = context.manager->nodeScopes[node].Obj(); { FOREACH_INDEXER(Ptr, 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, 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, memberDecl, classDecl->declarations) { memberDecl->Accept(&visitor); } } GenerateStatementInstructions(context, node->statement); INSTRUCTION(Ins::LoadValue({})); 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(); 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({})); 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(WfVirtualCfeDeclaration* node)override { FOREACH(Ptr, decl, node->expandedDeclarations) { decl->Accept(this); } } void Visit(WfVirtualCseDeclaration* node)override { FOREACH(Ptr, 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, 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, memberDecl, node->declarations) { GenerateClassMemberInstructionsVisitor visitor(context, node); memberDecl->Accept(&visitor); } } void Visit(WfEnumDeclaration* node)override { } void Visit(WfStructDeclaration* node)override { } void Visit(WfVirtualCfeDeclaration* node)override { FOREACH(Ptr, decl, node->expandedDeclarations) { decl->Accept(this); } } void Visit(WfVirtualCseDeclaration* node)override { FOREACH(Ptr, decl, node->expandedDeclarations) { decl->Accept(this); } } }; void GenerateDeclarationInstructions(WfCodegenContext& context, Ptr 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 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> argumentSymbols, capturedSymbols; CopyFrom( argumentSymbols, Range(0, scope->symbols.Count()) .Select([scope](vint index)->Ptr{return scope->symbols.GetByIndex(index)[0];}) .OrderBy([](Ptr a, Ptr 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, symbol, argumentSymbols) { meta->argumentNames.Add(symbol->name); } { auto capture = context.manager->lambdaCaptures.Get(node); FOREACH(Ptr, symbol, capture->symbols) { meta->capturedVariableNames.Add(L"" + symbol->name); capturedSymbols.Add(symbol); } vint count = context.GetThisStackCount(scope); for (vint i = 0; i < count; i++) { meta->capturedVariableNames.Add(L"" + 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 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) #define FILL_LABEL_TO_INS(LABEL, INS) context.assembly->instructions[LABEL].indexParameter = INS #define FILL_LABEL_TO_CURRENT(LABEL) FILL_LABEL_TO_INS(LABEL, context.assembly->instructions.Count()) /*********************************************************************** 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& getName) { auto meta = MakePtr(); 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({})); } 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 td = result.type->GetTypeDescriptor(); auto enumType = td->GetEnumType(); vint index = enumType->IndexOfItem(name); if (index != -1) { auto intValue = enumType->GetItemValue(index); INSTRUCTION(Ins::LoadValue({ intValue, td })); 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 capture; Ptr 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" in " + context.functionContext->function->name; }); auto capture = context.manager->lambdaCaptures.Get(node); FOREACH(Ptr, 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({})); break; case WfLiteralValue::True: INSTRUCTION(Ins::LoadValue({ true })); break; case WfLiteralValue::False: INSTRUCTION(Ins::LoadValue({ false })); break; } } #define INSTRUCTION_LOAD_VALUE(TYPE) if (td == description::GetTypeDescriptor()) { INSTRUCTION(Ins::LoadValue({ UnboxValue(output) })); return; } void Visit(WfFloatingExpression* node)override { auto result = context.manager->expressionResolvings[node]; auto td = result.type->GetTypeDescriptor(); Value output; td->GetSerializableType()->Deserialize(node->value.value, output); INSTRUCTION_LOAD_VALUE(float); INSTRUCTION_LOAD_VALUE(double); CHECK_FAIL(L"Unrecognized value in WfFloatingExpression!"); } void Visit(WfIntegerExpression* node)override { auto result = context.manager->expressionResolvings[node]; auto td = result.type->GetTypeDescriptor(); Value output; td->GetSerializableType()->Deserialize(node->value.value, output); INSTRUCTION_LOAD_VALUE(vint8_t); INSTRUCTION_LOAD_VALUE(vint16_t); INSTRUCTION_LOAD_VALUE(vint32_t); INSTRUCTION_LOAD_VALUE(vint64_t); INSTRUCTION_LOAD_VALUE(vuint8_t); INSTRUCTION_LOAD_VALUE(vuint16_t); INSTRUCTION_LOAD_VALUE(vuint32_t); INSTRUCTION_LOAD_VALUE(vuint64_t); INSTRUCTION_LOAD_VALUE(float); INSTRUCTION_LOAD_VALUE(double); CHECK_FAIL(L"Unrecognized value in WfIntegerExpression!"); } #undef INSTRUCTION_LOAD_VALUE void Visit(WfStringExpression* node)override { INSTRUCTION(Ins::LoadValue({ 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()) { 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()) { 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::FlagAnd) { auto type = context.manager->expressionResolvings[node].type; if (type->GetTypeDescriptor() == description::GetTypeDescriptor()) { 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())); GenerateExpressionInstructions(context, node->second, type); INSTRUCTION(Ins::ConvertToType(Value::BoxedValue, description::GetTypeDescriptor())); INSTRUCTION(Ins::OpAnd(WfInsType::U8)); INSTRUCTION(Ins::ConvertToType(Value::BoxedValue, type->GetTypeDescriptor())); } } else if (node->op == WfBinaryOperator::FlagOr) { auto type = context.manager->expressionResolvings[node].type; GenerateExpressionInstructions(context, node->first, type); INSTRUCTION(Ins::ConvertToType(Value::BoxedValue, description::GetTypeDescriptor())); GenerateExpressionInstructions(context, node->second, type); INSTRUCTION(Ins::ConvertToType(Value::BoxedValue, description::GetTypeDescriptor())); 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)); FILL_LABEL_TO_CURRENT(trapInstruction); GenerateExpressionInstructions(context, node->second, result.type); FILL_LABEL_TO_CURRENT(finishInstruction); } else { Ptr 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) { GenerateExpressionInstructions(context, node->first); GenerateExpressionInstructions(context, node->second); INSTRUCTION(Ins::CompareValue()); if (node->op == WfBinaryOperator::NE) { INSTRUCTION(Ins::OpNot(WfInsType::Bool)); } return; } } } 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 variableIndices(node->variables.Count()); auto function = context.functionContext->function; FOREACH_INDEXER(Ptr, var, index, node->variables) { auto symbol = scope->symbols[var->name.value][0]; vint variableIndex = function->argumentNames.Count() + function->localVariableNames.Add(L"" + 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, var, index, node->variables) { INSTRUCTION(Ins::LoadValue({})); 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)); FILL_LABEL_TO_CURRENT(fillTrueIndex); GenerateExpressionInstructions(context, node->trueBranch, result.type); FILL_LABEL_TO_CURRENT(fillEndIndex); } 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({ (vint)1 })); INSTRUCTION(Ins::OpAdd(type)); } GenerateExpressionInstructions(context, node->end, elementType); if (node->endBoundary == WfRangeBoundary::Exclusive) { INSTRUCTION(Ins::LoadValue({ (vint)1 })); INSTRUCTION(Ins::OpSub(type)); } INSTRUCTION(Ins::CreateRange(type)); } void Visit(WfSetTestingExpression* node)override { if (auto range = node->collection.Cast()) { 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""); 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({})); 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(); 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, argument, node->arguments) { auto prop = td->GetPropertyByName(argument->key.Cast()->name.value, true); GenerateExpressionInstructions(context, argument->value, CopyTypeInfo(prop->GetReturn())); INSTRUCTION(Ins::UpdateProperty(prop)); } } else if (result.type->GetTypeDescriptor() == description::GetTypeDescriptor() || result.type->GetTypeDescriptor() == description::GetTypeDescriptor() || result.type->GetTypeDescriptor() == description::GetTypeDescriptor()) { Ptr keyType = CopyTypeInfo(result.type->GetElementType()->GetGenericArgument(0)); FOREACH(Ptr, argument, From(node->arguments).Reverse()) { GenerateExpressionInstructions(context, argument->key, keyType); } INSTRUCTION(Ins::CreateArray(node->arguments.Count())); } else if (result.type->GetTypeDescriptor() == description::GetTypeDescriptor()) { Ptr keyType = CopyTypeInfo(result.type->GetElementType()->GetGenericArgument(0)); FOREACH(Ptr, argument, From(node->arguments).Reverse()) { GenerateExpressionInstructions(context, argument->key, keyType); } INSTRUCTION(Ins::CreateObservableList(node->arguments.Count())); } else { Ptr keyType = CopyTypeInfo(result.type->GetElementType()->GetGenericArgument(0)); Ptr valueType = CopyTypeInfo(result.type->GetElementType()->GetGenericArgument(1)); FOREACH(Ptr, 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({})); INSTRUCTION(Ins::CompareReference()); break; case WfTypeTesting::IsNotNull: GenerateExpressionInstructions(context, node->expression); INSTRUCTION(Ins::LoadValue({})); 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, false); INSTRUCTION(Ins::LoadValue({ type->GetTypeDescriptor() })); } 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()) { 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()) { 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, argument, node->arguments) { GenerateExpressionInstructions(context, argument); } auto result = context.manager->expressionResolvings[node->function.Obj()]; if (result.methodInfo) { if (result.methodInfo->IsStatic()) { INSTRUCTION(Ins::LoadValue({})); } else if (auto member = node->function.Cast()) { 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()) { 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()) { if (result.symbol->ownerScope->ownerNode.Cast()) { 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& getName) { auto scope = context.manager->nodeScopes[node].Obj(); bool inNewInterfaceExpr = scope->parentScope && scope->parentScope->ownerNode.Cast(); auto functionIndex = AddClosure(context, lc, getName); if (inNewInterfaceExpr) { INSTRUCTION(Ins::LoadFunction(functionIndex)); } else { auto capture = context.manager->lambdaCaptures.Get(node); FOREACH(Ptr, 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"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> variableSymbols; List> closureFunctions; List> overrideFunctions; WfFunctionDeclaration* firstFunction = nullptr; NewInterfaceExpressionVisitor(WfCodegenContext& _context) :context(_context) { } void Dispatch(WfVirtualCfeDeclaration* node)override { FOREACH(Ptr, decl, node->expandedDeclarations) { decl->Accept(this); } } void Dispatch(WfVirtualCseDeclaration* node)override { CHECK_FAIL(L"NewInterfaceExpressionVisitor::Visit(WfVirtualCseDeclaration*)#Internal error, Temporary not supported."); } 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, 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, argument, node->arguments) { GenerateExpressionInstructions(context, argument); } INSTRUCTION(Ins::LoadValue({})); 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(); 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({})); INSTRUCTION(Ins::CreateClosureContext(capture->symbols.Count() + thisCount + 1)); FOREACH(Ptr, func, declVisitor.closureFunctions) { WfCodegenLambdaContext lc; lc.functionDeclaration = func.Obj(); auto functionIndex = AddClosure(context, lc, [=](vint index) { return L"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, 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"name.value + L"<" + result.type->GetTypeDescriptor()->GetTypeName() + L">(" + itow(index + declVisitor.closureFunctions.Count()) + L")> in " + context.functionContext->function->name; }); } } else { INSTRUCTION(Ins::LoadValue({})); INSTRUCTION(Ins::CreateClosureContext(1)); } INSTRUCTION(Ins::CreateInterface(result.constructorInfo, declVisitor.overrideFunctions.Count() * 2)); } void Visit(WfVirtualCfeExpression* node)override { GenerateExpressionInstructions(context, node->expandedExpression); } void Visit(WfVirtualCseExpression* node)override { GenerateExpressionInstructions(context, node->expandedExpression); } }; #undef FILL_LABEL_TO_CURRENT #undef FILL_LABEL_TO_INS #undef INSTRUCTION Ptr GenerateExpressionInstructions(WfCodegenContext& context, Ptr expression, Ptr 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 meta) { FOREACH(Ptr, 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, symbol, capture->symbols) { meta->capturedVariableNames.Add(L"" + 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"" + itow(i)); } } } class GenerateGlobalClassMemberMetadataVisitor : public Object, public WfDeclaration::IVisitor { public: WfCodegenContext& context; WString namePrefix; Ptr classDecl; GenerateGlobalClassMemberMetadataVisitor(WfCodegenContext& _context, const WString& _namePrefix, Ptr _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(); 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(); 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(); meta->name = namePrefix + L"#ctor"; FOREACH(Ptr, argument, node->arguments) { meta->argumentNames.Add(argument->name.value); } meta->capturedVariableNames.Add(L"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(); info->functionIndex = index; } void Visit(WfDestructorDeclaration* node)override { auto meta = MakePtr(); meta->name = namePrefix + L"#dtor"; meta->capturedVariableNames.Add(L"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(); info->destructorFunctionIndex = index; } void Visit(WfClassDeclaration* node)override { GenerateGlobalDeclarationMetadata(context, node, namePrefix); } void Visit(WfEnumDeclaration* node)override { } void Visit(WfStructDeclaration* node)override { } void Visit(WfVirtualCfeDeclaration* node)override { FOREACH(Ptr, decl, node->expandedDeclarations) { decl->Accept(this); } } void Visit(WfVirtualCseDeclaration* node)override { FOREACH(Ptr, 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, decl, node->declarations) { GenerateGlobalDeclarationMetadata(context, decl, namePrefix + node->name.value + L"::"); } } void Visit(WfFunctionDeclaration* node)override { auto meta = MakePtr(); 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, 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(WfVirtualCfeDeclaration* node)override { FOREACH(Ptr, decl, node->expandedDeclarations) { decl->Accept(this); } } void Visit(WfVirtualCseDeclaration* node)override { FOREACH(Ptr, decl, node->expandedDeclarations) { decl->Accept(this); } } }; void GenerateGlobalDeclarationMetadata(WfCodegenContext& context, Ptr 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 FILL_LABEL_TO_INS(LABEL, INS) context.assembly->instructions[LABEL].indexParameter = INS #define FILL_LABEL_TO_CURRENT(LABEL) FILL_LABEL_TO_INS(LABEL, context.assembly->instructions.Count()) #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 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, const WString& name = WString::Empty) { vint index = context.functionContext->scopeContextStack.Count() - 1; while (index >= 0) { auto scopeContext = context.functionContext->scopeContextStack[index]; bool found = false; if (scopeContext->type == untilScopeType) { if (name == L"" || scopeContext->name == name) { found = true; } } if (exclusive && found) break; ApplyExitCode(scopeContext); if (!exclusive && found) 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({})); } 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()) { 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"" + 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({})); 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({})); INSTRUCTION(Ins::StoreLocalVar(variableIndex)); } vint fillEndIndex = INSTRUCTION(Ins::Jump(-1)); FILL_LABEL_TO_CURRENT(fillElseIndex); if (node->falseBranch) { GenerateStatementInstructions(context, node->falseBranch); } FILL_LABEL_TO_CURRENT(fillEndIndex); } 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) { FILL_LABEL_TO_INS(index, continueLabelIndex); } FOREACH(vint, index, loopContext->breakInstructions) { FILL_LABEL_TO_INS(index, breakLabelIndex); } context.functionContext->PopScopeContext(); } Pair GenerateTryProtected(WfStatement* node, Ptr protectedStatement, Ptr 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"" + node->name.value; } else { exceptionName = L""; } auto function = context.functionContext->function; vint variableIndex = function->argumentNames.Count() + function->localVariableNames.Add(L"" + node->name.value); if (exceptionSymbol) { context.functionContext->localVariables.Add(exceptionSymbol, variableIndex); } return variableIndex; } void GenerateTrap(WfTryStatement* node, vint variableIndex, Pair trap) { FILL_LABEL_TO_CURRENT(trap.key); 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 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 FILL_LABEL_TO_CURRENT(trap1.value); if (trap2.value != -1) { FILL_LABEL_TO_CURRENT(trap2.value); } if (node->finallyStatement) { GenerateStatementInstructions(context, node->finallyStatement); } } void Visit(WfBlockStatement* node)override { Ptr blockContext; if (node->endLabel.value != L"") { blockContext = context.functionContext->PushScopeContext(WfCodegenScopeType::Block, node->endLabel.value); } FOREACH(Ptr, statement, node->statements) { GenerateStatementInstructions(context, statement); } if (blockContext) { vint breakLabelIndex = context.assembly->instructions.Count(); FOREACH(vint, index, blockContext->breakInstructions) { FILL_LABEL_TO_INS(index, breakLabelIndex); } context.functionContext->PopScopeContext(); } } void Visit(WfGotoStatement* node)override { InlineScopeExitCode(WfCodegenScopeType::Block, false, node->label.value); context.functionContext->GetCurrentScopeContext(WfCodegenScopeType::Block, node->label.value)->breakInstructions.Add(INSTRUCTION(Ins::Jump(-1))); } 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(WfVirtualCseStatement* 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."); } void Visit(WfStateMachineStatement* node)override { CHECK_FAIL(L"GenerateStatementInstructionsVisitor::Visit(WfStateMachineStatement*)#Internal error, All state machine statements do not emit instructions."); } }; #undef EXIT_CODE #undef FILL_LABEL_TO_CURRENT #undef FILL_LABEL_TO_INS #undef INSTRUCTION void GenerateStatementInstructions(WfCodegenContext& context, Ptr 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>& value, const vl::collections::List& tokens) { FOREACH(Ptr, decl, value) { if (!decl->classMember) { decl->classMember = MakePtr(); decl->classMember->codeRange = decl->codeRange; decl->classMember->kind = WfClassMemberKind::Normal; } } } void UnescapeStringInternal(vl::parsing::ParsingToken& value, bool formatString) { value.value = GenerateToStream([&](StreamWriter& writer) { 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(); 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); } } }); } void UnescapeFormatString(vl::parsing::ParsingToken& value, const vl::collections::List& tokens) { UnescapeStringInternal(value, true); } void UnescapeString(vl::parsing::ParsingToken& value, const vl::collections::List& 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; default: CHECK_FAIL(L"Internal error: Unknown value."); } 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); switch (node->writability) { case WfMapWritability::Readonly: writer.WriteString(L"const "); break; case WfMapWritability::Writable: break; default: CHECK_FAIL(L"Internal error: Unknown value."); } WfPrint(node->value, indent, writer); writer.WriteString(L"["); if (node->key) { WfPrint(node->key, indent, writer); } writer.WriteString(L"]"); writer.AfterPrint(node); } void Visit(WfObservableListType* node)override { writer.BeforePrint(node); writer.WriteString(L"observe "); WfPrint(node->element, 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, 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 WfVirtualCfeExpression::IVisitor , public WfVirtualCseExpression::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; default: CHECK_FAIL(L"Internal error: Unknown value."); } 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; default: CHECK_FAIL(L"Internal error: Unknown value."); } 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::FlagAnd: writer.WriteString(L" & "); break; case WfBinaryOperator::FlagOr: 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: CHECK_FAIL(L"Internal error: Unknown value."); } 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, var, index, node->variables) { if (index > 0) { writer.WriteString(L", "); } writer.BeforePrint(var.Obj()); writer.WriteString(var->name.value); writer.WriteString(L" = "); WfPrint(var->value, indent, writer); writer.AfterPrint(var.Obj()); } 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 "); switch (node->beginBoundary) { case WfRangeBoundary::Exclusive: writer.WriteString(L"("); break; case WfRangeBoundary::Inclusive: writer.WriteString(L"["); break; default: CHECK_FAIL(L"Internal error: Unknown value."); } WfPrint(node->begin, indent, writer); writer.WriteString(L", "); WfPrint(node->end, indent, writer); switch (node->beginBoundary) { case WfRangeBoundary::Exclusive: writer.WriteString(L")"); break; case WfRangeBoundary::Inclusive: writer.WriteString(L"]"); break; default: CHECK_FAIL(L"Internal error: Unknown value."); } writer.AfterPrint(node); } void Visit(WfSetTestingExpression* node)override { writer.BeforePrint(node); WfPrint(node->element, indent, writer); switch (node->test) { case WfSetTesting::In: writer.WriteString(L" in "); break; case WfSetTesting::NotIn: writer.WriteString(L" not in "); break; default: CHECK_FAIL(L"Internal error: Unknown value."); } WfPrint(node->collection, indent, writer); writer.AfterPrint(node); } void Visit(WfConstructorExpression* node)override { writer.BeforePrint(node); writer.WriteString(L"{"); FOREACH_INDEXER(Ptr, 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.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); switch (node->strategy) { case WfTypeCastingStrategy::Strong: writer.WriteString(L"(cast ("); WfPrint(node->type, indent, writer); writer.WriteString(L") "); WfPrint(node->expression, indent, writer); writer.WriteString(L")"); break; case WfTypeCastingStrategy::Weak: writer.WriteString(L"("); WfPrint(node->expression, indent, writer); writer.WriteString(L" as ("); WfPrint(node->type, indent, writer); writer.WriteString(L"))"); break; default: CHECK_FAIL(L"Internal error: Unknown value."); } 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; default: CHECK_FAIL(L"Internal error: Unknown value."); } 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"); switch (node->observeType) { case WfObserveType::ExtendedObserve: writer.WriteString(L" as "); writer.WriteString(node->name.value); break; case WfObserveType::SimpleObserve: break; default: CHECK_FAIL(L"Internal error: Unknown value."); } writer.WriteString(L"("); WfPrint(node->expression, indent, writer); if (node->events.Count() > 0) { writer.WriteString(L" on "); FOREACH_INDEXER(Ptr, 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, 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(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, 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, 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(WfVirtualCfeExpression* node)override { if (node->expandedExpression) { writer.BeforePrint(node); WfPrint(node->expandedExpression, indent, writer); writer.AfterPrint(node); } else { node->Accept((WfVirtualCfeExpression::IVisitor*)this); } } void Visit(WfFormatExpression* node)override { writer.BeforePrint(node); writer.WriteString(L"$"); EscapeString(node->value.value, writer); writer.AfterPrint(node); } void Visit(WfVirtualCseExpression* node)override { if (node->expandedExpression) { writer.BeforePrint(node); WfPrint(node->expandedExpression, indent, writer); writer.AfterPrint(node); } else { node->Accept((WfVirtualCseExpression::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(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.WriteString(L")"); writer.AfterPrint(node); } void Visit(WfExpectedTypeCastExpression* node)override { writer.BeforePrint(node); switch (node->strategy) { case WfTypeCastingStrategy::Strong: writer.WriteString(L"(cast * "); WfPrint(node->expression, indent, writer); writer.WriteString(L")"); break; case WfTypeCastingStrategy::Weak: writer.WriteString(L"("); WfPrint(node->expression, indent, writer); writer.WriteString(L" as *)"); break; default: CHECK_FAIL(L"Internal error: Unknown value."); } writer.AfterPrint(node); } void Visit(WfCoOperatorExpression* node)override { writer.BeforePrint(node); writer.WriteString(L"$."); writer.WriteString(node->name.value); writer.AfterPrint(node); } }; /*********************************************************************** Print (Statement) ***********************************************************************/ class PrintStatementVisitor : public Object , public WfStatement::IVisitor , public WfVirtualCseStatement::IVisitor , public WfCoroutineStatement::IVisitor , public WfStateMachineStatement::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()) { 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, statement, node->statements) { writer.WriteString(indent + L" "); WfPrint(statement, indent + L" ", writer); writer.WriteLine(L""); } if (node->endLabel.value != L"") { writer.WriteString(indent + L" "); writer.WriteString(node->endLabel.value); writer.WriteLine(L":;"); } writer.WriteString(indent); writer.WriteString(L"}"); writer.AfterPrint(node); } void Visit(WfGotoStatement* node)override { writer.BeforePrint(node); writer.WriteString(L"goto "); writer.WriteString(node->label.value); 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(node->variable), indent, writer); writer.AfterPrint(node); } void Visit(WfVirtualCseStatement* node)override { if (node->expandedStatement) { writer.BeforePrint(node); WfPrint(node->expandedStatement, indent, writer); writer.AfterPrint(node); } else { node->Accept((WfVirtualCseStatement::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, switchCase, node->caseBranches) { writer.BeforePrint(switchCase.Obj()); 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.AfterPrint(switchCase.Obj()); 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 "); switch (node->direction) { case WfForEachDirection::Reversed: writer.WriteString(L"reversed "); break; case WfForEachDirection::Normal: break; default: CHECK_FAIL(L"Internal error: Unknown value."); } 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, argument, index, node->arguments) { writer.WriteString(index == 0 ? L" " : L", "); WfPrint(argument, indent, writer); } writer.WriteString(L";"); } void Visit(WfStateMachineStatement* node)override { node->Accept((WfStateMachineStatement::IVisitor*)this); } void Visit(WfStateSwitchStatement* node)override { writer.BeforePrint(node); writer.WriteString(L"switch ("); switch (node->type) { case WfStateSwitchType::Default: writer.WriteLine(L"raise)"); break; case WfStateSwitchType::Pass: writer.WriteLine(L"continue)"); break; case WfStateSwitchType::PassAndReturn: writer.WriteLine(L"continue, return)"); break; case WfStateSwitchType::Ignore: writer.WriteLine(L")"); break; case WfStateSwitchType::IgnoreAndReturn: writer.WriteLine(L"return)"); break; default: CHECK_FAIL(L"Internal error: Unknown value."); } writer.WriteString(indent); writer.WriteLine(L"{"); FOREACH(Ptr, switchCase, node->caseBranches) { writer.BeforePrint(switchCase.Obj()); writer.WriteString(indent); writer.WriteString(L" case "); writer.WriteString(switchCase->name.value); writer.WriteString(L"("); FOREACH_INDEXER(Ptr, argument, index, switchCase->arguments) { if (index != 0) writer.WriteString(L", "); writer.BeforePrint(argument.Obj()); writer.WriteString(argument->name.value); writer.AfterPrint(argument.Obj()); } writer.WriteLine(L"):"); writer.WriteString(indent + L" "); WfPrint(switchCase->statement, indent + L" ", writer); writer.AfterPrint(switchCase.Obj()); writer.WriteLine(L""); } writer.WriteString(indent); writer.WriteString(L"}"); writer.AfterPrint(node); } void Visit(WfStateInvokeStatement* node)override { writer.BeforePrint(node); switch (node->type) { case WfStateInvokeType::Goto: writer.WriteString(L"$goto_state "); break; case WfStateInvokeType::Push: writer.WriteString(L"push_state "); break; default: CHECK_FAIL(L"Internal error: Unknown value."); } writer.WriteString(node->name.value); writer.WriteString(L"("); FOREACH_INDEXER(Ptr, argument, index, node->arguments) { if (index != 0) writer.WriteString(L", "); WfPrint(argument, indent, writer); } writer.WriteString(L");"); writer.AfterPrint(node); } }; /*********************************************************************** Print (Declaration) ***********************************************************************/ class PrintDeclarationVisitor : public Object , public WfDeclaration::IVisitor , public WfVirtualCfeDeclaration::IVisitor , public WfVirtualCseDeclaration::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, 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 "); switch (node->anonymity) { case WfFunctionAnonymity::Named: writer.WriteString(node->name.value); break; case WfFunctionAnonymity::Anonymous: break; default: CHECK_FAIL(L"Internal error: Unknown value."); } writer.WriteString(L"("); FOREACH_INDEXER(Ptr, argument, index, node->arguments) { if (index > 0) { writer.WriteString(L", "); } writer.BeforePrint(argument.Obj()); FOREACH(Ptr, attribute, argument->attributes) { WfPrint(attribute, indent, writer); writer.WriteString(L" "); } writer.WriteString(argument->name.value); writer.WriteString(L" : "); WfPrint(argument->type, indent, writer); writer.AfterPrint(argument.Obj()); } 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, 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); switch (node->constructorType) { case WfConstructorType::RawPtr: writer.WriteString(L"new* "); break; case WfConstructorType::SharedPtr: writer.WriteString(L"new "); break; default: CHECK_FAIL(L"Internal error: Unknown value."); } writer.WriteString(L"("); FOREACH_INDEXER(Ptr, argument, index, node->arguments) { if (index > 0) { writer.WriteString(L", "); } writer.BeforePrint(argument.Obj()); writer.WriteString(argument->name.value); writer.WriteString(L" : "); WfPrint(argument->type, indent, writer); writer.AfterPrint(argument.Obj()); } writer.WriteString(L")"); FOREACH_INDEXER(Ptr, call, callIndex, node->baseConstructorCalls) { writer.WriteLine(L""); writer.WriteString(indent + L" "); if (callIndex == 0) { writer.WriteString(L":"); } else { writer.WriteString(L","); } writer.BeforePrint(call.Obj()); WfPrint(call->type, indent + L" ", writer); writer.WriteString(L"("); FOREACH_INDEXER(Ptr, argument, argumentIndex, call->arguments) { if (argumentIndex != 0) { writer.WriteString(L", "); } WfPrint(argument, indent + L" ", writer); } writer.WriteString(L")"); writer.AfterPrint(call.Obj()); } 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; default: CHECK_FAIL(L"Internal error: Unknown value."); } writer.WriteString(node->name.value); switch (node->kind) { case WfClassKind::Class: switch (node->constructorType) { case WfConstructorType::Undefined: break; default: CHECK_FAIL(L"Internal error: Unknown value."); } break; case WfClassKind::Interface: switch (node->constructorType) { case WfConstructorType::RawPtr: writer.WriteString(L"*"); case WfConstructorType::SharedPtr: break; default: CHECK_FAIL(L"Internal error: Unknown value."); } break; } FOREACH_INDEXER(Ptr, 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, 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; default: CHECK_FAIL(L"Internal error: Unknown value."); } writer.WriteLine(node->name.value); writer.WriteLine(indent + L"{"); auto newIndent = indent + L" "; FOREACH(Ptr, item, node->items) { writer.BeforePrint(item.Obj()); FOREACH(Ptr, 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, itemInt, index, item->intersections) { if (index != 0)writer.WriteString(L" | "); writer.WriteString(itemInt->name.value); } break; default: CHECK_FAIL(L"Internal error: Unknown value."); } writer.AfterPrint(item.Obj()); 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, member, node->members) { writer.BeforePrint(member.Obj()); FOREACH(Ptr, 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.AfterPrint(member.Obj()); } writer.WriteString(indent + L"}"); writer.AfterPrint(node); } void PrintExpandedDeclarations(List>& decls) { FOREACH_INDEXER(Ptr, decl, index, decls) { if (index > 0) { writer.WriteLine(L""); writer.WriteString(indent); } WfPrint(decl, indent, writer); if (index < decls.Count() - 1) { writer.WriteLine(L""); } } } void Visit(WfVirtualCfeDeclaration* node)override { if (node->expandedDeclarations.Count() > 0) { writer.BeforePrint(node); PrintExpandedDeclarations(node->expandedDeclarations); writer.AfterPrint(node); } else { node->Accept(static_cast(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" {"); switch (node->configConst) { case WfAPConst::Readonly: switch (node->configObserve) { case WfAPObserve::NotObservable: writer.WriteString(L"const, not observe"); break; case WfAPObserve::Observable: writer.WriteString(L"const"); break; default: CHECK_FAIL(L"Internal error: Unknown value."); } break; case WfAPConst::Writable: switch (node->configObserve) { case WfAPObserve::NotObservable: writer.WriteString(L"not observe"); break; case WfAPObserve::Observable: break; default: CHECK_FAIL(L"Internal error: Unknown value."); } break; default: CHECK_FAIL(L"Internal error: Unknown value."); } 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); } void Visit(WfVirtualCseDeclaration* node)override { if (node->expandedDeclarations.Count() > 0) { writer.BeforePrint(node); PrintExpandedDeclarations(node->expandedDeclarations); writer.AfterPrint(node); } else { node->Accept(static_cast(this)); } } void Visit(WfStateMachineDeclaration* node)override { writer.BeforePrint(node); writer.WriteLine(L"$state_machine"); writer.WriteLine(indent + L"{"); FOREACH_INDEXER(Ptr, input, index, node->inputs) { if (index != 0) writer.WriteLine(L""); writer.BeforePrint(input.Obj()); writer.WriteString(indent + L" $state_input "); writer.WriteString(input->name.value); writer.WriteString(L"("); FOREACH_INDEXER(Ptr, argument, index, input->arguments) { if (index > 0) { writer.WriteString(L", "); } writer.BeforePrint(argument.Obj()); writer.WriteString(argument->name.value); writer.WriteString(L" : "); WfPrint(argument->type, indent, writer); writer.AfterPrint(argument.Obj()); } writer.WriteLine(L");"); writer.AfterPrint(input.Obj()); } FOREACH_INDEXER(Ptr, state, index, node->states) { if (index != 0 || node->inputs.Count() > 0) writer.WriteLine(L""); writer.BeforePrint(state.Obj()); writer.WriteString(indent + L" $state "); if (state->name.value == L"") { writer.WriteString(L"default"); } else { writer.WriteString(state->name.value); } writer.WriteString(L"("); FOREACH_INDEXER(Ptr, argument, index, state->arguments) { if (index > 0) { writer.WriteString(L", "); } writer.BeforePrint(argument.Obj()); writer.WriteString(argument->name.value); writer.WriteString(L" : "); WfPrint(argument->type, indent, writer); writer.AfterPrint(argument.Obj()); } writer.WriteLine(L")"); writer.WriteString(indent + L" "); WfPrint(state->statement, indent + L" ", writer); writer.AfterPrint(state.Obj()); writer.WriteLine(L""); } writer.WriteString(indent + L"}"); writer.AfterPrint(node); } }; /*********************************************************************** Print (Module) ***********************************************************************/ void WfPrint(Ptr 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 node, const WString& indent, parsing::ParsingWriter& writer) { PrintTypeVisitor visitor(indent, writer); node->Accept(&visitor); } void WfPrint(Ptr node, const WString& indent, parsing::ParsingWriter& writer) { PrintExpressionVisitor visitor(indent, writer); node->Accept(&visitor); } void WfPrint(Ptr node, const WString& indent, parsing::ParsingWriter& writer) { PrintStatementVisitor visitor(indent, writer); node->Accept(&visitor); } void WfPrint(Ptr node, const WString& indent, parsing::ParsingWriter& writer) { FOREACH(Ptr, 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; default: CHECK_FAIL(L"Internal error: Unknown value."); } } PrintDeclarationVisitor visitor(indent, writer); node->Accept(&visitor); } void WfPrint(Ptr 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; default: CHECK_FAIL(L"Internal error: Unknown value."); } FOREACH(Ptr, path, node->paths) { writer.WriteString(indent); writer.WriteString(L"using "); FOREACH_INDEXER(Ptr, item, index, path->items) { if (index > 0) { writer.WriteString(L"::"); } FOREACH(Ptr, fragment, item->fragments) { if (auto name = fragment.Cast()) { writer.WriteString(name->name.value); } else { writer.WriteString(L"*"); } } } writer.WriteLine(L";"); } FOREACH(Ptr, decl, node->declarations) { writer.WriteLine(L""); writer.WriteString(indent); WfPrint(decl, indent, writer); writer.WriteLine(L""); } } /*********************************************************************** Print (Module) ***********************************************************************/ void WfPrint(Ptr node, const WString& indent, stream::TextWriter& writer) { ParsingWriter parsingWriter(writer); WfPrint(node, indent, parsingWriter); } void WfPrint(Ptr node, const WString& indent, stream::TextWriter& writer) { ParsingWriter parsingWriter(writer); WfPrint(node, indent, parsingWriter); } void WfPrint(Ptr node, const WString& indent, stream::TextWriter& writer) { ParsingWriter parsingWriter(writer); WfPrint(node, indent, parsingWriter); } void WfPrint(Ptr node, const WString& indent, stream::TextWriter& writer) { ParsingWriter parsingWriter(writer); WfPrint(node, indent, parsingWriter); } void WfPrint(Ptr node, const WString& indent, stream::TextWriter& writer) { ParsingWriter parsingWriter(writer); WfPrint(node, indent, parsingWriter); } void WfPrint(Ptr node, const WString& indent, stream::TextWriter& writer) { ParsingWriter parsingWriter(writer); WfPrint(node, indent, parsingWriter); } } } /*********************************************************************** .\EXPRESSION\WFEXPRESSION_AST.CPP ***********************************************************************/ /*********************************************************************** This file is generated by: Vczh Parser Generator From parser definition:WfExpression.parser.txt Licensed under https://github.com/vczh-libraries/License ***********************************************************************/ 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 WfObservableListType::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 WfVirtualCfeDeclaration::Accept(WfDeclaration::IVisitor* visitor) { visitor->Visit(this); } void WfAutoPropertyDeclaration::Accept(WfVirtualCfeDeclaration::IVisitor* visitor) { visitor->Visit(this); } void WfCastResultInterfaceDeclaration::Accept(WfVirtualCfeDeclaration::IVisitor* visitor) { visitor->Visit(this); } void WfVirtualCseDeclaration::Accept(WfDeclaration::IVisitor* visitor) { visitor->Visit(this); } void WfStateMachineDeclaration::Accept(WfVirtualCseDeclaration::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 WfGotoStatement::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 WfVirtualCseStatement::Accept(WfStatement::IVisitor* visitor) { visitor->Visit(this); } void WfForEachStatement::Accept(WfVirtualCseStatement::IVisitor* visitor) { visitor->Visit(this); } void WfSwitchStatement::Accept(WfVirtualCseStatement::IVisitor* visitor) { visitor->Visit(this); } void WfCoProviderStatement::Accept(WfVirtualCseStatement::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 WfStateMachineStatement::Accept(WfStatement::IVisitor* visitor) { visitor->Visit(this); } void WfStateSwitchStatement::Accept(WfStateMachineStatement::IVisitor* visitor) { visitor->Visit(this); } void WfStateInvokeStatement::Accept(WfStateMachineStatement::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 WfVirtualCfeExpression::Accept(WfExpression::IVisitor* visitor) { visitor->Visit(this); } void WfFormatExpression::Accept(WfVirtualCfeExpression::IVisitor* visitor) { visitor->Visit(this); } void WfVirtualCseExpression::Accept(WfExpression::IVisitor* visitor) { visitor->Visit(this); } void WfBindExpression::Accept(WfVirtualCseExpression::IVisitor* visitor) { visitor->Visit(this); } void WfNewCoroutineExpression::Accept(WfVirtualCseExpression::IVisitor* visitor) { visitor->Visit(this); } void WfMixinCastExpression::Accept(WfVirtualCseExpression::IVisitor* visitor) { visitor->Visit(this); } void WfExpectedTypeCastExpression::Accept(WfVirtualCseExpression::IVisitor* visitor) { visitor->Visit(this); } void WfCoOperatorExpression::Accept(WfVirtualCseExpression::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::WfObservableListType, workflow::WfObservableListType) 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::WfVirtualCfeDeclaration, workflow::WfVirtualCfeDeclaration) 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::WfVirtualCseDeclaration, workflow::WfVirtualCseDeclaration) IMPL_TYPE_INFO_RENAME(vl::workflow::WfStateInput, workflow::WfStateInput) IMPL_TYPE_INFO_RENAME(vl::workflow::WfStateDeclaration, workflow::WfStateDeclaration) IMPL_TYPE_INFO_RENAME(vl::workflow::WfStateMachineDeclaration, workflow::WfStateMachineDeclaration) 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::WfGotoStatement, workflow::WfGotoStatement) IMPL_TYPE_INFO_RENAME(vl::workflow::WfVariableStatement, workflow::WfVariableStatement) IMPL_TYPE_INFO_RENAME(vl::workflow::WfExpressionStatement, workflow::WfExpressionStatement) IMPL_TYPE_INFO_RENAME(vl::workflow::WfVirtualCseStatement, workflow::WfVirtualCseStatement) 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::WfStateSwitchType, workflow::WfStateSwitchType) IMPL_TYPE_INFO_RENAME(vl::workflow::WfStateInvokeType, workflow::WfStateInvokeType) IMPL_TYPE_INFO_RENAME(vl::workflow::WfStateMachineStatement, workflow::WfStateMachineStatement) IMPL_TYPE_INFO_RENAME(vl::workflow::WfStateSwitchArgument, workflow::WfStateSwitchArgument) IMPL_TYPE_INFO_RENAME(vl::workflow::WfStateSwitchCase, workflow::WfStateSwitchCase) IMPL_TYPE_INFO_RENAME(vl::workflow::WfStateSwitchStatement, workflow::WfStateSwitchStatement) IMPL_TYPE_INFO_RENAME(vl::workflow::WfStateInvokeStatement, workflow::WfStateInvokeStatement) 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::WfVirtualCfeExpression, workflow::WfVirtualCfeExpression) IMPL_TYPE_INFO_RENAME(vl::workflow::WfFormatExpression, workflow::WfFormatExpression) IMPL_TYPE_INFO_RENAME(vl::workflow::WfVirtualCseExpression, workflow::WfVirtualCseExpression) IMPL_TYPE_INFO_RENAME(vl::workflow::WfBindExpression, workflow::WfBindExpression) IMPL_TYPE_INFO_RENAME(vl::workflow::WfNewCoroutineExpression, workflow::WfNewCoroutineExpression) IMPL_TYPE_INFO_RENAME(vl::workflow::WfMixinCastExpression, workflow::WfMixinCastExpression) IMPL_TYPE_INFO_RENAME(vl::workflow::WfExpectedTypeCastExpression, workflow::WfExpectedTypeCastExpression) IMPL_TYPE_INFO_RENAME(vl::workflow::WfCoOperatorExpression, workflow::WfCoOperatorExpression) 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::WfVirtualCfeDeclaration::IVisitor, workflow::WfVirtualCfeDeclaration::IVisitor) IMPL_TYPE_INFO_RENAME(vl::workflow::WfVirtualCseDeclaration::IVisitor, workflow::WfVirtualCseDeclaration::IVisitor) IMPL_TYPE_INFO_RENAME(vl::workflow::WfVirtualCseStatement::IVisitor, workflow::WfVirtualCseStatement::IVisitor) IMPL_TYPE_INFO_RENAME(vl::workflow::WfCoroutineStatement::IVisitor, workflow::WfCoroutineStatement::IVisitor) IMPL_TYPE_INFO_RENAME(vl::workflow::WfStateMachineStatement::IVisitor, workflow::WfStateMachineStatement::IVisitor) IMPL_TYPE_INFO_RENAME(vl::workflow::WfVirtualCfeExpression::IVisitor, workflow::WfVirtualCfeExpression::IVisitor) IMPL_TYPE_INFO_RENAME(vl::workflow::WfVirtualCseExpression::IVisitor, workflow::WfVirtualCseExpression::IVisitor) IMPL_TYPE_INFO_RENAME(vl::workflow::WfModuleUsingFragment::IVisitor, workflow::WfModuleUsingFragment::IVisitor) #ifdef VCZH_DESCRIPTABLEOBJECT_WITH_METADATA 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(), 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(), 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(), NO_PARAMETER) CLASS_MEMBER_FIELD(name) END_CLASS_MEMBER(WfPredefinedType) BEGIN_CLASS_MEMBER(WfTopQualifiedType) CLASS_MEMBER_BASE(WfType) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) PARSING_TOKEN_FIELD(name) END_CLASS_MEMBER(WfTopQualifiedType) BEGIN_CLASS_MEMBER(WfReferenceType) CLASS_MEMBER_BASE(WfType) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) PARSING_TOKEN_FIELD(name) END_CLASS_MEMBER(WfReferenceType) BEGIN_CLASS_MEMBER(WfRawPointerType) CLASS_MEMBER_BASE(WfType) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(element) END_CLASS_MEMBER(WfRawPointerType) BEGIN_CLASS_MEMBER(WfSharedPointerType) CLASS_MEMBER_BASE(WfType) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(element) END_CLASS_MEMBER(WfSharedPointerType) BEGIN_CLASS_MEMBER(WfNullableType) CLASS_MEMBER_BASE(WfType) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(element) END_CLASS_MEMBER(WfNullableType) BEGIN_CLASS_MEMBER(WfEnumerableType) CLASS_MEMBER_BASE(WfType) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), 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(), NO_PARAMETER) CLASS_MEMBER_FIELD(writability) CLASS_MEMBER_FIELD(key) CLASS_MEMBER_FIELD(value) END_CLASS_MEMBER(WfMapType) BEGIN_CLASS_MEMBER(WfObservableListType) CLASS_MEMBER_BASE(WfType) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(element) END_CLASS_MEMBER(WfObservableListType) BEGIN_CLASS_MEMBER(WfFunctionType) CLASS_MEMBER_BASE(WfType) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), 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(), 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(), NO_PARAMETER) CLASS_MEMBER_FIELD(declarations) END_CLASS_MEMBER(WfNamespaceDeclaration) BEGIN_CLASS_MEMBER(WfFunctionArgument) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), 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(), 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(), 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(), NO_PARAMETER) CLASS_MEMBER_FIELD(arguments) END_CLASS_MEMBER(WfEventDeclaration) BEGIN_CLASS_MEMBER(WfPropertyDeclaration) CLASS_MEMBER_BASE(WfDeclaration) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), 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(), 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(), 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(), NO_PARAMETER) CLASS_MEMBER_FIELD(statement) END_CLASS_MEMBER(WfDestructorDeclaration) BEGIN_CLASS_MEMBER(WfClassDeclaration) CLASS_MEMBER_BASE(WfDeclaration) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), 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(), NO_PARAMETER) PARSING_TOKEN_FIELD(name) END_CLASS_MEMBER(WfEnumItemIntersection) BEGIN_CLASS_MEMBER(WfEnumItem) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), 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(), NO_PARAMETER) CLASS_MEMBER_FIELD(kind) CLASS_MEMBER_FIELD(items) END_CLASS_MEMBER(WfEnumDeclaration) BEGIN_CLASS_MEMBER(WfStructMember) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), 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(), NO_PARAMETER) CLASS_MEMBER_FIELD(members) END_CLASS_MEMBER(WfStructDeclaration) BEGIN_CLASS_MEMBER(WfVirtualCfeDeclaration) CLASS_MEMBER_BASE(WfDeclaration) CLASS_MEMBER_METHOD_OVERLOAD(Accept, {L"visitor"}, void(WfVirtualCfeDeclaration::*)(WfVirtualCfeDeclaration::IVisitor* visitor)) CLASS_MEMBER_FIELD(expandedDeclarations) END_CLASS_MEMBER(WfVirtualCfeDeclaration) 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(WfVirtualCfeDeclaration) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), 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(WfVirtualCfeDeclaration) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(baseType) CLASS_MEMBER_FIELD(elementType) END_CLASS_MEMBER(WfCastResultInterfaceDeclaration) BEGIN_CLASS_MEMBER(WfVirtualCseDeclaration) CLASS_MEMBER_BASE(WfDeclaration) CLASS_MEMBER_METHOD_OVERLOAD(Accept, {L"visitor"}, void(WfVirtualCseDeclaration::*)(WfVirtualCseDeclaration::IVisitor* visitor)) CLASS_MEMBER_FIELD(expandedDeclarations) END_CLASS_MEMBER(WfVirtualCseDeclaration) BEGIN_CLASS_MEMBER(WfStateInput) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) PARSING_TOKEN_FIELD(name) CLASS_MEMBER_FIELD(arguments) END_CLASS_MEMBER(WfStateInput) BEGIN_CLASS_MEMBER(WfStateDeclaration) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) PARSING_TOKEN_FIELD(name) CLASS_MEMBER_FIELD(arguments) CLASS_MEMBER_FIELD(statement) END_CLASS_MEMBER(WfStateDeclaration) BEGIN_CLASS_MEMBER(WfStateMachineDeclaration) CLASS_MEMBER_BASE(WfVirtualCseDeclaration) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(inputs) CLASS_MEMBER_FIELD(states) END_CLASS_MEMBER(WfStateMachineDeclaration) BEGIN_CLASS_MEMBER(WfBreakStatement) CLASS_MEMBER_BASE(WfStatement) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) END_CLASS_MEMBER(WfBreakStatement) BEGIN_CLASS_MEMBER(WfContinueStatement) CLASS_MEMBER_BASE(WfStatement) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) END_CLASS_MEMBER(WfContinueStatement) BEGIN_CLASS_MEMBER(WfReturnStatement) CLASS_MEMBER_BASE(WfStatement) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(expression) END_CLASS_MEMBER(WfReturnStatement) BEGIN_CLASS_MEMBER(WfDeleteStatement) CLASS_MEMBER_BASE(WfStatement) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(expression) END_CLASS_MEMBER(WfDeleteStatement) BEGIN_CLASS_MEMBER(WfRaiseExceptionStatement) CLASS_MEMBER_BASE(WfStatement) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(expression) END_CLASS_MEMBER(WfRaiseExceptionStatement) BEGIN_CLASS_MEMBER(WfIfStatement) CLASS_MEMBER_BASE(WfStatement) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), 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(), 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(), 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(), NO_PARAMETER) CLASS_MEMBER_FIELD(statements) PARSING_TOKEN_FIELD(endLabel) END_CLASS_MEMBER(WfBlockStatement) BEGIN_CLASS_MEMBER(WfGotoStatement) CLASS_MEMBER_BASE(WfStatement) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) PARSING_TOKEN_FIELD(label) END_CLASS_MEMBER(WfGotoStatement) BEGIN_CLASS_MEMBER(WfVariableStatement) CLASS_MEMBER_BASE(WfStatement) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(variable) END_CLASS_MEMBER(WfVariableStatement) BEGIN_CLASS_MEMBER(WfExpressionStatement) CLASS_MEMBER_BASE(WfStatement) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(expression) END_CLASS_MEMBER(WfExpressionStatement) BEGIN_CLASS_MEMBER(WfVirtualCseStatement) CLASS_MEMBER_BASE(WfStatement) CLASS_MEMBER_METHOD_OVERLOAD(Accept, {L"visitor"}, void(WfVirtualCseStatement::*)(WfVirtualCseStatement::IVisitor* visitor)) CLASS_MEMBER_FIELD(expandedStatement) END_CLASS_MEMBER(WfVirtualCseStatement) 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(WfVirtualCseStatement) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), 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(), NO_PARAMETER) CLASS_MEMBER_FIELD(expression) CLASS_MEMBER_FIELD(statement) END_CLASS_MEMBER(WfSwitchCase) BEGIN_CLASS_MEMBER(WfSwitchStatement) CLASS_MEMBER_BASE(WfVirtualCseStatement) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), 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(WfVirtualCseStatement) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), 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(), NO_PARAMETER) CLASS_MEMBER_FIELD(statement) END_CLASS_MEMBER(WfCoPauseStatement) BEGIN_CLASS_MEMBER(WfCoOperatorStatement) CLASS_MEMBER_BASE(WfCoroutineStatement) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) PARSING_TOKEN_FIELD(varName) PARSING_TOKEN_FIELD(opName) CLASS_MEMBER_FIELD(arguments) END_CLASS_MEMBER(WfCoOperatorStatement) BEGIN_ENUM_ITEM(WfStateSwitchType) ENUM_ITEM_NAMESPACE(WfStateSwitchType) ENUM_NAMESPACE_ITEM(Default) ENUM_NAMESPACE_ITEM(Pass) ENUM_NAMESPACE_ITEM(PassAndReturn) ENUM_NAMESPACE_ITEM(Ignore) ENUM_NAMESPACE_ITEM(IgnoreAndReturn) END_ENUM_ITEM(WfStateSwitchType) BEGIN_ENUM_ITEM(WfStateInvokeType) ENUM_ITEM_NAMESPACE(WfStateInvokeType) ENUM_NAMESPACE_ITEM(Goto) ENUM_NAMESPACE_ITEM(Push) END_ENUM_ITEM(WfStateInvokeType) BEGIN_CLASS_MEMBER(WfStateMachineStatement) CLASS_MEMBER_BASE(WfStatement) CLASS_MEMBER_METHOD_OVERLOAD(Accept, {L"visitor"}, void(WfStateMachineStatement::*)(WfStateMachineStatement::IVisitor* visitor)) END_CLASS_MEMBER(WfStateMachineStatement) BEGIN_CLASS_MEMBER(WfStateSwitchArgument) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) PARSING_TOKEN_FIELD(name) END_CLASS_MEMBER(WfStateSwitchArgument) BEGIN_CLASS_MEMBER(WfStateSwitchCase) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) PARSING_TOKEN_FIELD(name) CLASS_MEMBER_FIELD(arguments) CLASS_MEMBER_FIELD(statement) END_CLASS_MEMBER(WfStateSwitchCase) BEGIN_CLASS_MEMBER(WfStateSwitchStatement) CLASS_MEMBER_BASE(WfStateMachineStatement) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(type) CLASS_MEMBER_FIELD(caseBranches) END_CLASS_MEMBER(WfStateSwitchStatement) BEGIN_CLASS_MEMBER(WfStateInvokeStatement) CLASS_MEMBER_BASE(WfStateMachineStatement) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(type) PARSING_TOKEN_FIELD(name) CLASS_MEMBER_FIELD(arguments) END_CLASS_MEMBER(WfStateInvokeStatement) BEGIN_CLASS_MEMBER(WfThisExpression) CLASS_MEMBER_BASE(WfExpression) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) END_CLASS_MEMBER(WfThisExpression) BEGIN_CLASS_MEMBER(WfTopQualifiedExpression) CLASS_MEMBER_BASE(WfExpression) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) PARSING_TOKEN_FIELD(name) END_CLASS_MEMBER(WfTopQualifiedExpression) BEGIN_CLASS_MEMBER(WfReferenceExpression) CLASS_MEMBER_BASE(WfExpression) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) PARSING_TOKEN_FIELD(name) END_CLASS_MEMBER(WfReferenceExpression) BEGIN_CLASS_MEMBER(WfOrderedNameExpression) CLASS_MEMBER_BASE(WfExpression) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) PARSING_TOKEN_FIELD(name) END_CLASS_MEMBER(WfOrderedNameExpression) BEGIN_CLASS_MEMBER(WfOrderedLambdaExpression) CLASS_MEMBER_BASE(WfExpression) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(body) END_CLASS_MEMBER(WfOrderedLambdaExpression) BEGIN_CLASS_MEMBER(WfMemberExpression) CLASS_MEMBER_BASE(WfExpression) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), 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(), 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(), NO_PARAMETER) CLASS_MEMBER_FIELD(value) END_CLASS_MEMBER(WfLiteralExpression) BEGIN_CLASS_MEMBER(WfFloatingExpression) CLASS_MEMBER_BASE(WfExpression) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) PARSING_TOKEN_FIELD(value) END_CLASS_MEMBER(WfFloatingExpression) BEGIN_CLASS_MEMBER(WfIntegerExpression) CLASS_MEMBER_BASE(WfExpression) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) PARSING_TOKEN_FIELD(value) END_CLASS_MEMBER(WfIntegerExpression) BEGIN_CLASS_MEMBER(WfStringExpression) CLASS_MEMBER_BASE(WfExpression) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), 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(), 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(FlagAnd) ENUM_NAMESPACE_ITEM(FlagOr) 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(), 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(), 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(), 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(), 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(), 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(), 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(), 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(), NO_PARAMETER) CLASS_MEMBER_FIELD(arguments) END_CLASS_MEMBER(WfConstructorExpression) BEGIN_CLASS_MEMBER(WfInferExpression) CLASS_MEMBER_BASE(WfExpression) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), 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(), 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(), 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(), NO_PARAMETER) CLASS_MEMBER_FIELD(type) END_CLASS_MEMBER(WfTypeOfTypeExpression) BEGIN_CLASS_MEMBER(WfTypeOfExpressionExpression) CLASS_MEMBER_BASE(WfExpression) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(expression) END_CLASS_MEMBER(WfTypeOfExpressionExpression) BEGIN_CLASS_MEMBER(WfAttachEventExpression) CLASS_MEMBER_BASE(WfExpression) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), 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(), 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(), 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(), 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(), NO_PARAMETER) CLASS_MEMBER_FIELD(function) END_CLASS_MEMBER(WfFunctionExpression) BEGIN_CLASS_MEMBER(WfNewClassExpression) CLASS_MEMBER_BASE(WfExpression) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), 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(), NO_PARAMETER) CLASS_MEMBER_FIELD(type) CLASS_MEMBER_FIELD(declarations) END_CLASS_MEMBER(WfNewInterfaceExpression) BEGIN_CLASS_MEMBER(WfVirtualCfeExpression) CLASS_MEMBER_BASE(WfExpression) CLASS_MEMBER_METHOD_OVERLOAD(Accept, {L"visitor"}, void(WfVirtualCfeExpression::*)(WfVirtualCfeExpression::IVisitor* visitor)) CLASS_MEMBER_FIELD(expandedExpression) END_CLASS_MEMBER(WfVirtualCfeExpression) BEGIN_CLASS_MEMBER(WfFormatExpression) CLASS_MEMBER_BASE(WfVirtualCfeExpression) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) PARSING_TOKEN_FIELD(value) END_CLASS_MEMBER(WfFormatExpression) BEGIN_CLASS_MEMBER(WfVirtualCseExpression) CLASS_MEMBER_BASE(WfExpression) CLASS_MEMBER_METHOD_OVERLOAD(Accept, {L"visitor"}, void(WfVirtualCseExpression::*)(WfVirtualCseExpression::IVisitor* visitor)) CLASS_MEMBER_FIELD(expandedExpression) END_CLASS_MEMBER(WfVirtualCseExpression) BEGIN_CLASS_MEMBER(WfBindExpression) CLASS_MEMBER_BASE(WfVirtualCseExpression) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(expression) END_CLASS_MEMBER(WfBindExpression) BEGIN_CLASS_MEMBER(WfNewCoroutineExpression) CLASS_MEMBER_BASE(WfVirtualCseExpression) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) PARSING_TOKEN_FIELD(name) CLASS_MEMBER_FIELD(statement) END_CLASS_MEMBER(WfNewCoroutineExpression) BEGIN_CLASS_MEMBER(WfMixinCastExpression) CLASS_MEMBER_BASE(WfVirtualCseExpression) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(type) CLASS_MEMBER_FIELD(expression) END_CLASS_MEMBER(WfMixinCastExpression) BEGIN_CLASS_MEMBER(WfExpectedTypeCastExpression) CLASS_MEMBER_BASE(WfVirtualCseExpression) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(strategy) CLASS_MEMBER_FIELD(expression) END_CLASS_MEMBER(WfExpectedTypeCastExpression) BEGIN_CLASS_MEMBER(WfCoOperatorExpression) CLASS_MEMBER_BASE(WfVirtualCseExpression) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) PARSING_TOKEN_FIELD(name) END_CLASS_MEMBER(WfCoOperatorExpression) 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(), NO_PARAMETER) PARSING_TOKEN_FIELD(name) END_CLASS_MEMBER(WfModuleUsingNameFragment) BEGIN_CLASS_MEMBER(WfModuleUsingWildCardFragment) CLASS_MEMBER_BASE(WfModuleUsingFragment) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) END_CLASS_MEMBER(WfModuleUsingWildCardFragment) BEGIN_CLASS_MEMBER(WfModuleUsingItem) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), NO_PARAMETER) CLASS_MEMBER_FIELD(fragments) END_CLASS_MEMBER(WfModuleUsingItem) BEGIN_CLASS_MEMBER(WfModuleUsingPath) CLASS_MEMBER_CONSTRUCTOR(vl::Ptr(), 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(), 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::*)(WfObservableListType* 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::*)(WfVirtualCfeExpression* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfExpression::IVisitor::*)(WfVirtualCseExpression* 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::*)(WfGotoStatement* 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::*)(WfVirtualCseStatement* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfStatement::IVisitor::*)(WfCoroutineStatement* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfStatement::IVisitor::*)(WfStateMachineStatement* 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::*)(WfVirtualCfeDeclaration* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfDeclaration::IVisitor::*)(WfVirtualCseDeclaration* node)) END_INTERFACE_MEMBER(WfDeclaration) BEGIN_INTERFACE_MEMBER(WfVirtualCfeDeclaration::IVisitor) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfVirtualCfeDeclaration::IVisitor::*)(WfAutoPropertyDeclaration* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfVirtualCfeDeclaration::IVisitor::*)(WfCastResultInterfaceDeclaration* node)) END_INTERFACE_MEMBER(WfVirtualCfeDeclaration) BEGIN_INTERFACE_MEMBER(WfVirtualCseDeclaration::IVisitor) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfVirtualCseDeclaration::IVisitor::*)(WfStateMachineDeclaration* node)) END_INTERFACE_MEMBER(WfVirtualCseDeclaration) BEGIN_INTERFACE_MEMBER(WfVirtualCseStatement::IVisitor) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfVirtualCseStatement::IVisitor::*)(WfForEachStatement* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfVirtualCseStatement::IVisitor::*)(WfSwitchStatement* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfVirtualCseStatement::IVisitor::*)(WfCoProviderStatement* node)) END_INTERFACE_MEMBER(WfVirtualCseStatement) 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(WfStateMachineStatement::IVisitor) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfStateMachineStatement::IVisitor::*)(WfStateSwitchStatement* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfStateMachineStatement::IVisitor::*)(WfStateInvokeStatement* node)) END_INTERFACE_MEMBER(WfStateMachineStatement) BEGIN_INTERFACE_MEMBER(WfVirtualCfeExpression::IVisitor) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfVirtualCfeExpression::IVisitor::*)(WfFormatExpression* node)) END_INTERFACE_MEMBER(WfVirtualCfeExpression) BEGIN_INTERFACE_MEMBER(WfVirtualCseExpression::IVisitor) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfVirtualCseExpression::IVisitor::*)(WfBindExpression* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfVirtualCseExpression::IVisitor::*)(WfNewCoroutineExpression* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfVirtualCseExpression::IVisitor::*)(WfMixinCastExpression* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfVirtualCseExpression::IVisitor::*)(WfExpectedTypeCastExpression* node)) CLASS_MEMBER_METHOD_OVERLOAD(Visit, {L"node"}, void(WfVirtualCseExpression::IVisitor::*)(WfCoOperatorExpression* node)) END_INTERFACE_MEMBER(WfVirtualCseExpression) 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) #endif #undef PARSING_TOKEN_FIELD #ifdef VCZH_DESCRIPTABLEOBJECT_WITH_METADATA 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::WfObservableListType) 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::WfVirtualCfeDeclaration) 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::WfVirtualCseDeclaration) ADD_TYPE_INFO(vl::workflow::WfStateInput) ADD_TYPE_INFO(vl::workflow::WfStateDeclaration) ADD_TYPE_INFO(vl::workflow::WfStateMachineDeclaration) 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::WfGotoStatement) ADD_TYPE_INFO(vl::workflow::WfVariableStatement) ADD_TYPE_INFO(vl::workflow::WfExpressionStatement) ADD_TYPE_INFO(vl::workflow::WfVirtualCseStatement) 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::WfStateSwitchType) ADD_TYPE_INFO(vl::workflow::WfStateInvokeType) ADD_TYPE_INFO(vl::workflow::WfStateMachineStatement) ADD_TYPE_INFO(vl::workflow::WfStateSwitchArgument) ADD_TYPE_INFO(vl::workflow::WfStateSwitchCase) ADD_TYPE_INFO(vl::workflow::WfStateSwitchStatement) ADD_TYPE_INFO(vl::workflow::WfStateInvokeStatement) 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::WfVirtualCfeExpression) ADD_TYPE_INFO(vl::workflow::WfFormatExpression) ADD_TYPE_INFO(vl::workflow::WfVirtualCseExpression) ADD_TYPE_INFO(vl::workflow::WfBindExpression) ADD_TYPE_INFO(vl::workflow::WfNewCoroutineExpression) ADD_TYPE_INFO(vl::workflow::WfMixinCastExpression) ADD_TYPE_INFO(vl::workflow::WfExpectedTypeCastExpression) ADD_TYPE_INFO(vl::workflow::WfCoOperatorExpression) 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::WfVirtualCfeDeclaration::IVisitor) ADD_TYPE_INFO(vl::workflow::WfVirtualCseDeclaration::IVisitor) ADD_TYPE_INFO(vl::workflow::WfVirtualCseStatement::IVisitor) ADD_TYPE_INFO(vl::workflow::WfCoroutineStatement::IVisitor) ADD_TYPE_INFO(vl::workflow::WfStateMachineStatement::IVisitor) ADD_TYPE_INFO(vl::workflow::WfVirtualCfeExpression::IVisitor) ADD_TYPE_INFO(vl::workflow::WfVirtualCseExpression::IVisitor) ADD_TYPE_INFO(vl::workflow::WfModuleUsingFragment::IVisitor) } void Unload(ITypeManager* manager) { } }; #endif #endif bool WfLoadTypes() { #ifdef VCZH_DESCRIPTABLEOBJECT_WITH_METADATA ITypeManager* manager = GetGlobalTypeManager(); if(manager) { Ptr loader = new WfTypeLoader; return manager->AddTypeLoader(loader); } #endif return false; } } } } /*********************************************************************** .\EXPRESSION\WFEXPRESSION_COPY.CPP ***********************************************************************/ /*********************************************************************** This file is generated by: Vczh Parser Generator From parser definition:WfExpression.parser.txt Licensed under https://github.com/vczh-libraries/License ***********************************************************************/ namespace vl { namespace workflow { namespace copy_visitor { /*********************************************************************** TypeVisitor ***********************************************************************/ // CopyFields ---------------------------------------- void TypeVisitor::CopyFields(WfPredefinedType* from, WfPredefinedType* to) { to->name = from->name; CopyFields(static_cast(from), static_cast(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(from), static_cast(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(from), static_cast(to)); } void TypeVisitor::CopyFields(WfRawPointerType* from, WfRawPointerType* to) { to->element = CreateField(from->element); CopyFields(static_cast(from), static_cast(to)); } void TypeVisitor::CopyFields(WfSharedPointerType* from, WfSharedPointerType* to) { to->element = CreateField(from->element); CopyFields(static_cast(from), static_cast(to)); } void TypeVisitor::CopyFields(WfNullableType* from, WfNullableType* to) { to->element = CreateField(from->element); CopyFields(static_cast(from), static_cast(to)); } void TypeVisitor::CopyFields(WfEnumerableType* from, WfEnumerableType* to) { to->element = CreateField(from->element); CopyFields(static_cast(from), static_cast(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(from), static_cast(to)); } void TypeVisitor::CopyFields(WfObservableListType* from, WfObservableListType* to) { to->element = CreateField(from->element); CopyFields(static_cast(from), static_cast(to)); } void TypeVisitor::CopyFields(WfFunctionType* from, WfFunctionType* to) { to->result = CreateField(from->result); FOREACH(vl::Ptr, listItem, from->arguments) { to->arguments.Add(CreateField(listItem)); } CopyFields(static_cast(from), static_cast(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(from), static_cast(to)); } // Visitor Members ----------------------------------- void TypeVisitor::Visit(WfPredefinedType* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } void TypeVisitor::Visit(WfTopQualifiedType* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } void TypeVisitor::Visit(WfReferenceType* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } void TypeVisitor::Visit(WfRawPointerType* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } void TypeVisitor::Visit(WfSharedPointerType* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } void TypeVisitor::Visit(WfNullableType* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } void TypeVisitor::Visit(WfEnumerableType* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } void TypeVisitor::Visit(WfMapType* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } void TypeVisitor::Visit(WfObservableListType* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } void TypeVisitor::Visit(WfFunctionType* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } void TypeVisitor::Visit(WfChildType* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } /*********************************************************************** ExpressionVisitor ***********************************************************************/ // CopyFields ---------------------------------------- void ExpressionVisitor::CopyFields(WfThisExpression* from, WfThisExpression* to) { CopyFields(static_cast(from), static_cast(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(from), static_cast(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(from), static_cast(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(from), static_cast(to)); } void ExpressionVisitor::CopyFields(WfOrderedLambdaExpression* from, WfOrderedLambdaExpression* to) { to->body = CreateField(from->body); CopyFields(static_cast(from), static_cast(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(from), static_cast(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(from), static_cast(to)); } void ExpressionVisitor::CopyFields(WfLiteralExpression* from, WfLiteralExpression* to) { to->value = from->value; CopyFields(static_cast(from), static_cast(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(from), static_cast(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(from), static_cast(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(from), static_cast(to)); } void ExpressionVisitor::CopyFields(WfUnaryExpression* from, WfUnaryExpression* to) { to->op = from->op; to->operand = CreateField(from->operand); CopyFields(static_cast(from), static_cast(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(from), static_cast(to)); } void ExpressionVisitor::CopyFields(WfLetExpression* from, WfLetExpression* to) { FOREACH(vl::Ptr, listItem, from->variables) { to->variables.Add(CreateField(listItem)); } to->expression = CreateField(from->expression); CopyFields(static_cast(from), static_cast(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(from), static_cast(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(from), static_cast(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(from), static_cast(to)); } void ExpressionVisitor::CopyFields(WfConstructorExpression* from, WfConstructorExpression* to) { FOREACH(vl::Ptr, listItem, from->arguments) { to->arguments.Add(CreateField(listItem)); } CopyFields(static_cast(from), static_cast(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(from), static_cast(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(from), static_cast(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(from), static_cast(to)); } void ExpressionVisitor::CopyFields(WfTypeOfTypeExpression* from, WfTypeOfTypeExpression* to) { to->type = CreateField(from->type); CopyFields(static_cast(from), static_cast(to)); } void ExpressionVisitor::CopyFields(WfTypeOfExpressionExpression* from, WfTypeOfExpressionExpression* to) { to->expression = CreateField(from->expression); CopyFields(static_cast(from), static_cast(to)); } void ExpressionVisitor::CopyFields(WfAttachEventExpression* from, WfAttachEventExpression* to) { to->event = CreateField(from->event); to->function = CreateField(from->function); CopyFields(static_cast(from), static_cast(to)); } void ExpressionVisitor::CopyFields(WfDetachEventExpression* from, WfDetachEventExpression* to) { to->event = CreateField(from->event); to->handler = CreateField(from->handler); CopyFields(static_cast(from), static_cast(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, listItem, from->events) { to->events.Add(CreateField(listItem)); } CopyFields(static_cast(from), static_cast(to)); } void ExpressionVisitor::CopyFields(WfCallExpression* from, WfCallExpression* to) { to->function = CreateField(from->function); FOREACH(vl::Ptr, listItem, from->arguments) { to->arguments.Add(CreateField(listItem)); } CopyFields(static_cast(from), static_cast(to)); } void ExpressionVisitor::CopyFields(WfFunctionExpression* from, WfFunctionExpression* to) { to->function = CreateField(from->function); CopyFields(static_cast(from), static_cast(to)); } void ExpressionVisitor::CopyFields(WfFunctionDeclaration* from, WfFunctionDeclaration* to) { to->anonymity = from->anonymity; FOREACH(vl::Ptr, listItem, from->arguments) { to->arguments.Add(CreateField(listItem)); } to->returnType = CreateField(from->returnType); to->statement = CreateField(from->statement); CopyFields(static_cast(from), static_cast(to)); } void ExpressionVisitor::CopyFields(WfDeclaration* from, WfDeclaration* to) { FOREACH(vl::Ptr, 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, 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, listItem, from->arguments) { to->arguments.Add(CreateField(listItem)); } CopyFields(static_cast(from), static_cast(to)); } void ExpressionVisitor::CopyFields(WfNewInterfaceExpression* from, WfNewInterfaceExpression* to) { to->type = CreateField(from->type); FOREACH(vl::Ptr, listItem, from->declarations) { to->declarations.Add(CreateField(listItem)); } CopyFields(static_cast(from), static_cast(to)); } // CreateField --------------------------------------- vl::Ptr ExpressionVisitor::CreateField(vl::Ptr from) { if (!from) return nullptr; auto to = vl::MakePtr(); CopyFields(from.Obj(), to.Obj()); return to; } vl::Ptr ExpressionVisitor::CreateField(vl::Ptr from) { if (!from) return nullptr; auto to = vl::MakePtr(); CopyFields(from.Obj(), to.Obj()); return to; } vl::Ptr ExpressionVisitor::CreateField(vl::Ptr from) { if (!from) return nullptr; auto to = vl::MakePtr(); CopyFields(from.Obj(), to.Obj()); return to; } vl::Ptr ExpressionVisitor::CreateField(vl::Ptr from) { if (!from) return nullptr; auto to = vl::MakePtr(); CopyFields(from.Obj(), to.Obj()); return to; } vl::Ptr ExpressionVisitor::CreateField(vl::Ptr from) { if (!from) return nullptr; auto to = vl::MakePtr(); CopyFields(from.Obj(), to.Obj()); return to; } vl::Ptr ExpressionVisitor::CreateField(vl::Ptr from) { if (!from) return nullptr; auto to = vl::MakePtr(); CopyFields(from.Obj(), to.Obj()); return to; } // Visitor Members ----------------------------------- void ExpressionVisitor::Visit(WfThisExpression* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } void ExpressionVisitor::Visit(WfTopQualifiedExpression* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } void ExpressionVisitor::Visit(WfReferenceExpression* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } void ExpressionVisitor::Visit(WfOrderedNameExpression* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } void ExpressionVisitor::Visit(WfOrderedLambdaExpression* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } void ExpressionVisitor::Visit(WfMemberExpression* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } void ExpressionVisitor::Visit(WfChildExpression* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } void ExpressionVisitor::Visit(WfLiteralExpression* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } void ExpressionVisitor::Visit(WfFloatingExpression* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } void ExpressionVisitor::Visit(WfIntegerExpression* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } void ExpressionVisitor::Visit(WfStringExpression* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } void ExpressionVisitor::Visit(WfUnaryExpression* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } void ExpressionVisitor::Visit(WfBinaryExpression* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } void ExpressionVisitor::Visit(WfLetExpression* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } void ExpressionVisitor::Visit(WfIfExpression* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } void ExpressionVisitor::Visit(WfRangeExpression* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } void ExpressionVisitor::Visit(WfSetTestingExpression* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } void ExpressionVisitor::Visit(WfConstructorExpression* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } void ExpressionVisitor::Visit(WfInferExpression* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } void ExpressionVisitor::Visit(WfTypeCastingExpression* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } void ExpressionVisitor::Visit(WfTypeTestingExpression* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } void ExpressionVisitor::Visit(WfTypeOfTypeExpression* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } void ExpressionVisitor::Visit(WfTypeOfExpressionExpression* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } void ExpressionVisitor::Visit(WfAttachEventExpression* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } void ExpressionVisitor::Visit(WfDetachEventExpression* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } void ExpressionVisitor::Visit(WfObserveExpression* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } void ExpressionVisitor::Visit(WfCallExpression* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } void ExpressionVisitor::Visit(WfFunctionExpression* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } void ExpressionVisitor::Visit(WfNewClassExpression* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } void ExpressionVisitor::Visit(WfNewInterfaceExpression* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } void ExpressionVisitor::Visit(WfVirtualCfeExpression* node) { this->result = Dispatch(node); } void ExpressionVisitor::Visit(WfVirtualCseExpression* node) { this->result = Dispatch(node); } /*********************************************************************** StatementVisitor ***********************************************************************/ // CopyFields ---------------------------------------- void StatementVisitor::CopyFields(WfBreakStatement* from, WfBreakStatement* to) { CopyFields(static_cast(from), static_cast(to)); } void StatementVisitor::CopyFields(WfStatement* from, WfStatement* to) { to->codeRange = from->codeRange; } void StatementVisitor::CopyFields(WfContinueStatement* from, WfContinueStatement* to) { CopyFields(static_cast(from), static_cast(to)); } void StatementVisitor::CopyFields(WfReturnStatement* from, WfReturnStatement* to) { to->expression = CreateField(from->expression); CopyFields(static_cast(from), static_cast(to)); } void StatementVisitor::CopyFields(WfDeleteStatement* from, WfDeleteStatement* to) { to->expression = CreateField(from->expression); CopyFields(static_cast(from), static_cast(to)); } void StatementVisitor::CopyFields(WfRaiseExceptionStatement* from, WfRaiseExceptionStatement* to) { to->expression = CreateField(from->expression); CopyFields(static_cast(from), static_cast(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(from), static_cast(to)); } void StatementVisitor::CopyFields(WfWhileStatement* from, WfWhileStatement* to) { to->condition = CreateField(from->condition); to->statement = CreateField(from->statement); CopyFields(static_cast(from), static_cast(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(from), static_cast(to)); } void StatementVisitor::CopyFields(WfBlockStatement* from, WfBlockStatement* to) { FOREACH(vl::Ptr, listItem, from->statements) { to->statements.Add(CreateField(listItem)); } to->endLabel.codeRange = from->endLabel.codeRange; to->endLabel.tokenIndex = from->endLabel.tokenIndex; to->endLabel.value = from->endLabel.value; CopyFields(static_cast(from), static_cast(to)); } void StatementVisitor::CopyFields(WfGotoStatement* from, WfGotoStatement* to) { to->label.codeRange = from->label.codeRange; to->label.tokenIndex = from->label.tokenIndex; to->label.value = from->label.value; CopyFields(static_cast(from), static_cast(to)); } void StatementVisitor::CopyFields(WfVariableStatement* from, WfVariableStatement* to) { to->variable = CreateField(from->variable); CopyFields(static_cast(from), static_cast(to)); } void StatementVisitor::CopyFields(WfVariableDeclaration* from, WfVariableDeclaration* to) { to->type = CreateField(from->type); to->expression = CreateField(from->expression); CopyFields(static_cast(from), static_cast(to)); } void StatementVisitor::CopyFields(WfDeclaration* from, WfDeclaration* to) { FOREACH(vl::Ptr, 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(from), static_cast(to)); } // CreateField --------------------------------------- vl::Ptr StatementVisitor::CreateField(vl::Ptr from) { if (!from) return nullptr; auto to = vl::MakePtr(); CopyFields(from.Obj(), to.Obj()); return to; } vl::Ptr StatementVisitor::CreateField(vl::Ptr from) { if (!from) return nullptr; auto to = vl::MakePtr(); CopyFields(from.Obj(), to.Obj()); return to; } vl::Ptr StatementVisitor::CreateField(vl::Ptr from) { if (!from) return nullptr; auto to = vl::MakePtr(); CopyFields(from.Obj(), to.Obj()); return to; } // Visitor Members ----------------------------------- void StatementVisitor::Visit(WfBreakStatement* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } void StatementVisitor::Visit(WfContinueStatement* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } void StatementVisitor::Visit(WfReturnStatement* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } void StatementVisitor::Visit(WfDeleteStatement* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } void StatementVisitor::Visit(WfRaiseExceptionStatement* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } void StatementVisitor::Visit(WfIfStatement* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } void StatementVisitor::Visit(WfWhileStatement* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } void StatementVisitor::Visit(WfTryStatement* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } void StatementVisitor::Visit(WfBlockStatement* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } void StatementVisitor::Visit(WfGotoStatement* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } void StatementVisitor::Visit(WfVariableStatement* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } void StatementVisitor::Visit(WfExpressionStatement* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } void StatementVisitor::Visit(WfVirtualCseStatement* node) { this->result = Dispatch(node); } void StatementVisitor::Visit(WfCoroutineStatement* node) { this->result = Dispatch(node); } void StatementVisitor::Visit(WfStateMachineStatement* node) { this->result = Dispatch(node); } /*********************************************************************** DeclarationVisitor ***********************************************************************/ // CopyFields ---------------------------------------- void DeclarationVisitor::CopyFields(WfNamespaceDeclaration* from, WfNamespaceDeclaration* to) { FOREACH(vl::Ptr, listItem, from->declarations) { to->declarations.Add(CreateField(listItem)); } CopyFields(static_cast(from), static_cast(to)); } void DeclarationVisitor::CopyFields(WfDeclaration* from, WfDeclaration* to) { FOREACH(vl::Ptr, 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, listItem, from->arguments) { to->arguments.Add(CreateField(listItem)); } to->returnType = CreateField(from->returnType); to->statement = CreateField(from->statement); CopyFields(static_cast(from), static_cast(to)); } void DeclarationVisitor::CopyFields(WfFunctionArgument* from, WfFunctionArgument* to) { FOREACH(vl::Ptr, 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(from), static_cast(to)); } void DeclarationVisitor::CopyFields(WfEventDeclaration* from, WfEventDeclaration* to) { FOREACH(vl::Ptr, listItem, from->arguments) { to->arguments.Add(CreateField(listItem)); } CopyFields(static_cast(from), static_cast(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(from), static_cast(to)); } void DeclarationVisitor::CopyFields(WfConstructorDeclaration* from, WfConstructorDeclaration* to) { to->constructorType = from->constructorType; FOREACH(vl::Ptr, listItem, from->baseConstructorCalls) { to->baseConstructorCalls.Add(CreateField(listItem)); } FOREACH(vl::Ptr, listItem, from->arguments) { to->arguments.Add(CreateField(listItem)); } to->statement = CreateField(from->statement); CopyFields(static_cast(from), static_cast(to)); } void DeclarationVisitor::CopyFields(WfBaseConstructorCall* from, WfBaseConstructorCall* to) { to->type = CreateField(from->type); FOREACH(vl::Ptr, 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(from), static_cast(to)); } void DeclarationVisitor::CopyFields(WfClassDeclaration* from, WfClassDeclaration* to) { to->kind = from->kind; to->constructorType = from->constructorType; FOREACH(vl::Ptr, listItem, from->baseTypes) { to->baseTypes.Add(CreateField(listItem)); } FOREACH(vl::Ptr, listItem, from->declarations) { to->declarations.Add(CreateField(listItem)); } CopyFields(static_cast(from), static_cast(to)); } void DeclarationVisitor::CopyFields(WfEnumDeclaration* from, WfEnumDeclaration* to) { to->kind = from->kind; FOREACH(vl::Ptr, listItem, from->items) { to->items.Add(CreateField(listItem)); } CopyFields(static_cast(from), static_cast(to)); } void DeclarationVisitor::CopyFields(WfEnumItem* from, WfEnumItem* to) { FOREACH(vl::Ptr, 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, 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, listItem, from->members) { to->members.Add(CreateField(listItem)); } CopyFields(static_cast(from), static_cast(to)); } void DeclarationVisitor::CopyFields(WfStructMember* from, WfStructMember* to) { FOREACH(vl::Ptr, 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 DeclarationVisitor::CreateField(vl::Ptr from) { if (!from) return nullptr; auto to = vl::MakePtr(); CopyFields(from.Obj(), to.Obj()); return to; } vl::Ptr DeclarationVisitor::CreateField(vl::Ptr from) { if (!from) return nullptr; auto to = vl::MakePtr(); CopyFields(from.Obj(), to.Obj()); return to; } vl::Ptr DeclarationVisitor::CreateField(vl::Ptr from) { if (!from) return nullptr; auto to = vl::MakePtr(); CopyFields(from.Obj(), to.Obj()); return to; } vl::Ptr DeclarationVisitor::CreateField(vl::Ptr from) { if (!from) return nullptr; auto to = vl::MakePtr(); CopyFields(from.Obj(), to.Obj()); return to; } vl::Ptr DeclarationVisitor::CreateField(vl::Ptr from) { if (!from) return nullptr; auto to = vl::MakePtr(); CopyFields(from.Obj(), to.Obj()); return to; } vl::Ptr DeclarationVisitor::CreateField(vl::Ptr from) { if (!from) return nullptr; auto to = vl::MakePtr(); CopyFields(from.Obj(), to.Obj()); return to; } vl::Ptr DeclarationVisitor::CreateField(vl::Ptr from) { if (!from) return nullptr; auto to = vl::MakePtr(); CopyFields(from.Obj(), to.Obj()); return to; } // Visitor Members ----------------------------------- void DeclarationVisitor::Visit(WfNamespaceDeclaration* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } void DeclarationVisitor::Visit(WfFunctionDeclaration* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } void DeclarationVisitor::Visit(WfVariableDeclaration* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } void DeclarationVisitor::Visit(WfEventDeclaration* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } void DeclarationVisitor::Visit(WfPropertyDeclaration* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } void DeclarationVisitor::Visit(WfConstructorDeclaration* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } void DeclarationVisitor::Visit(WfDestructorDeclaration* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } void DeclarationVisitor::Visit(WfClassDeclaration* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } void DeclarationVisitor::Visit(WfEnumDeclaration* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } void DeclarationVisitor::Visit(WfStructDeclaration* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } void DeclarationVisitor::Visit(WfVirtualCfeDeclaration* node) { this->result = Dispatch(node); } void DeclarationVisitor::Visit(WfVirtualCseDeclaration* node) { this->result = Dispatch(node); } /*********************************************************************** VirtualCfeDeclarationVisitor ***********************************************************************/ // CopyFields ---------------------------------------- void VirtualCfeDeclarationVisitor::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(from), static_cast(to)); } void VirtualCfeDeclarationVisitor::CopyFields(WfVirtualCfeDeclaration* from, WfVirtualCfeDeclaration* to) { FOREACH(vl::Ptr, listItem, from->expandedDeclarations) { to->expandedDeclarations.Add(CreateField(listItem)); } CopyFields(static_cast(from), static_cast(to)); } void VirtualCfeDeclarationVisitor::CopyFields(WfDeclaration* from, WfDeclaration* to) { FOREACH(vl::Ptr, 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 VirtualCfeDeclarationVisitor::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 VirtualCfeDeclarationVisitor::CopyFields(WfClassMember* from, WfClassMember* to) { to->kind = from->kind; to->codeRange = from->codeRange; } void VirtualCfeDeclarationVisitor::CopyFields(WfCastResultInterfaceDeclaration* from, WfCastResultInterfaceDeclaration* to) { to->baseType = CreateField(from->baseType); to->elementType = CreateField(from->elementType); CopyFields(static_cast(from), static_cast(to)); } // CreateField --------------------------------------- vl::Ptr VirtualCfeDeclarationVisitor::CreateField(vl::Ptr from) { if (!from) return nullptr; auto to = vl::MakePtr(); CopyFields(from.Obj(), to.Obj()); return to; } vl::Ptr VirtualCfeDeclarationVisitor::CreateField(vl::Ptr from) { if (!from) return nullptr; auto to = vl::MakePtr(); CopyFields(from.Obj(), to.Obj()); return to; } // Visitor Members ----------------------------------- void VirtualCfeDeclarationVisitor::Visit(WfAutoPropertyDeclaration* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } void VirtualCfeDeclarationVisitor::Visit(WfCastResultInterfaceDeclaration* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } /*********************************************************************** VirtualCseDeclarationVisitor ***********************************************************************/ // CopyFields ---------------------------------------- void VirtualCseDeclarationVisitor::CopyFields(WfStateMachineDeclaration* from, WfStateMachineDeclaration* to) { FOREACH(vl::Ptr, listItem, from->inputs) { to->inputs.Add(CreateField(listItem)); } FOREACH(vl::Ptr, listItem, from->states) { to->states.Add(CreateField(listItem)); } CopyFields(static_cast(from), static_cast(to)); } void VirtualCseDeclarationVisitor::CopyFields(WfVirtualCseDeclaration* from, WfVirtualCseDeclaration* to) { FOREACH(vl::Ptr, listItem, from->expandedDeclarations) { to->expandedDeclarations.Add(CreateField(listItem)); } CopyFields(static_cast(from), static_cast(to)); } void VirtualCseDeclarationVisitor::CopyFields(WfDeclaration* from, WfDeclaration* to) { FOREACH(vl::Ptr, 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 VirtualCseDeclarationVisitor::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 VirtualCseDeclarationVisitor::CopyFields(WfClassMember* from, WfClassMember* to) { to->kind = from->kind; to->codeRange = from->codeRange; } void VirtualCseDeclarationVisitor::CopyFields(WfStateInput* from, WfStateInput* to) { to->name.codeRange = from->name.codeRange; to->name.tokenIndex = from->name.tokenIndex; to->name.value = from->name.value; FOREACH(vl::Ptr, listItem, from->arguments) { to->arguments.Add(CreateField(listItem)); } to->codeRange = from->codeRange; } void VirtualCseDeclarationVisitor::CopyFields(WfFunctionArgument* from, WfFunctionArgument* to) { FOREACH(vl::Ptr, 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 VirtualCseDeclarationVisitor::CopyFields(WfStateDeclaration* from, WfStateDeclaration* to) { to->name.codeRange = from->name.codeRange; to->name.tokenIndex = from->name.tokenIndex; to->name.value = from->name.value; FOREACH(vl::Ptr, listItem, from->arguments) { to->arguments.Add(CreateField(listItem)); } to->statement = CreateField(from->statement); to->codeRange = from->codeRange; } // CreateField --------------------------------------- vl::Ptr VirtualCseDeclarationVisitor::CreateField(vl::Ptr from) { if (!from) return nullptr; auto to = vl::MakePtr(); CopyFields(from.Obj(), to.Obj()); return to; } vl::Ptr VirtualCseDeclarationVisitor::CreateField(vl::Ptr from) { if (!from) return nullptr; auto to = vl::MakePtr(); CopyFields(from.Obj(), to.Obj()); return to; } vl::Ptr VirtualCseDeclarationVisitor::CreateField(vl::Ptr from) { if (!from) return nullptr; auto to = vl::MakePtr(); CopyFields(from.Obj(), to.Obj()); return to; } vl::Ptr VirtualCseDeclarationVisitor::CreateField(vl::Ptr from) { if (!from) return nullptr; auto to = vl::MakePtr(); CopyFields(from.Obj(), to.Obj()); return to; } vl::Ptr VirtualCseDeclarationVisitor::CreateField(vl::Ptr from) { if (!from) return nullptr; auto to = vl::MakePtr(); CopyFields(from.Obj(), to.Obj()); return to; } // Visitor Members ----------------------------------- void VirtualCseDeclarationVisitor::Visit(WfStateMachineDeclaration* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } /*********************************************************************** VirtualCseStatementVisitor ***********************************************************************/ // CopyFields ---------------------------------------- void VirtualCseStatementVisitor::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(from), static_cast(to)); } void VirtualCseStatementVisitor::CopyFields(WfVirtualCseStatement* from, WfVirtualCseStatement* to) { to->expandedStatement = CreateField(from->expandedStatement); CopyFields(static_cast(from), static_cast(to)); } void VirtualCseStatementVisitor::CopyFields(WfStatement* from, WfStatement* to) { to->codeRange = from->codeRange; } void VirtualCseStatementVisitor::CopyFields(WfSwitchStatement* from, WfSwitchStatement* to) { to->expression = CreateField(from->expression); FOREACH(vl::Ptr, listItem, from->caseBranches) { to->caseBranches.Add(CreateField(listItem)); } to->defaultBranch = CreateField(from->defaultBranch); CopyFields(static_cast(from), static_cast(to)); } void VirtualCseStatementVisitor::CopyFields(WfSwitchCase* from, WfSwitchCase* to) { to->expression = CreateField(from->expression); to->statement = CreateField(from->statement); to->codeRange = from->codeRange; } void VirtualCseStatementVisitor::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(from), static_cast(to)); } // CreateField --------------------------------------- vl::Ptr VirtualCseStatementVisitor::CreateField(vl::Ptr from) { if (!from) return nullptr; auto to = vl::MakePtr(); CopyFields(from.Obj(), to.Obj()); return to; } // Visitor Members ----------------------------------- void VirtualCseStatementVisitor::Visit(WfForEachStatement* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } void VirtualCseStatementVisitor::Visit(WfSwitchStatement* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } void VirtualCseStatementVisitor::Visit(WfCoProviderStatement* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } /*********************************************************************** CoroutineStatementVisitor ***********************************************************************/ // CopyFields ---------------------------------------- void CoroutineStatementVisitor::CopyFields(WfCoPauseStatement* from, WfCoPauseStatement* to) { to->statement = CreateField(from->statement); CopyFields(static_cast(from), static_cast(to)); } void CoroutineStatementVisitor::CopyFields(WfCoroutineStatement* from, WfCoroutineStatement* to) { CopyFields(static_cast(from), static_cast(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, listItem, from->arguments) { to->arguments.Add(CreateField(listItem)); } CopyFields(static_cast(from), static_cast(to)); } // Visitor Members ----------------------------------- void CoroutineStatementVisitor::Visit(WfCoPauseStatement* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } void CoroutineStatementVisitor::Visit(WfCoOperatorStatement* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } /*********************************************************************** StateMachineStatementVisitor ***********************************************************************/ // CopyFields ---------------------------------------- void StateMachineStatementVisitor::CopyFields(WfStateSwitchStatement* from, WfStateSwitchStatement* to) { to->type = from->type; FOREACH(vl::Ptr, listItem, from->caseBranches) { to->caseBranches.Add(CreateField(listItem)); } CopyFields(static_cast(from), static_cast(to)); } void StateMachineStatementVisitor::CopyFields(WfStateMachineStatement* from, WfStateMachineStatement* to) { CopyFields(static_cast(from), static_cast(to)); } void StateMachineStatementVisitor::CopyFields(WfStatement* from, WfStatement* to) { to->codeRange = from->codeRange; } void StateMachineStatementVisitor::CopyFields(WfStateSwitchCase* from, WfStateSwitchCase* to) { to->name.codeRange = from->name.codeRange; to->name.tokenIndex = from->name.tokenIndex; to->name.value = from->name.value; FOREACH(vl::Ptr, listItem, from->arguments) { to->arguments.Add(CreateField(listItem)); } to->statement = CreateField(from->statement); to->codeRange = from->codeRange; } void StateMachineStatementVisitor::CopyFields(WfStateSwitchArgument* from, WfStateSwitchArgument* to) { to->name.codeRange = from->name.codeRange; to->name.tokenIndex = from->name.tokenIndex; to->name.value = from->name.value; to->codeRange = from->codeRange; } void StateMachineStatementVisitor::CopyFields(WfStateInvokeStatement* from, WfStateInvokeStatement* to) { to->type = from->type; to->name.codeRange = from->name.codeRange; to->name.tokenIndex = from->name.tokenIndex; to->name.value = from->name.value; FOREACH(vl::Ptr, listItem, from->arguments) { to->arguments.Add(CreateField(listItem)); } CopyFields(static_cast(from), static_cast(to)); } // CreateField --------------------------------------- vl::Ptr StateMachineStatementVisitor::CreateField(vl::Ptr from) { if (!from) return nullptr; auto to = vl::MakePtr(); CopyFields(from.Obj(), to.Obj()); return to; } vl::Ptr StateMachineStatementVisitor::CreateField(vl::Ptr from) { if (!from) return nullptr; auto to = vl::MakePtr(); CopyFields(from.Obj(), to.Obj()); return to; } // Visitor Members ----------------------------------- void StateMachineStatementVisitor::Visit(WfStateSwitchStatement* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } void StateMachineStatementVisitor::Visit(WfStateInvokeStatement* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } /*********************************************************************** VirtualCfeExpressionVisitor ***********************************************************************/ // CopyFields ---------------------------------------- void VirtualCfeExpressionVisitor::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(from), static_cast(to)); } void VirtualCfeExpressionVisitor::CopyFields(WfVirtualCfeExpression* from, WfVirtualCfeExpression* to) { to->expandedExpression = CreateField(from->expandedExpression); CopyFields(static_cast(from), static_cast(to)); } void VirtualCfeExpressionVisitor::CopyFields(WfExpression* from, WfExpression* to) { to->codeRange = from->codeRange; } // Visitor Members ----------------------------------- void VirtualCfeExpressionVisitor::Visit(WfFormatExpression* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } /*********************************************************************** VirtualCseExpressionVisitor ***********************************************************************/ // CopyFields ---------------------------------------- void VirtualCseExpressionVisitor::CopyFields(WfBindExpression* from, WfBindExpression* to) { to->expression = CreateField(from->expression); CopyFields(static_cast(from), static_cast(to)); } void VirtualCseExpressionVisitor::CopyFields(WfVirtualCseExpression* from, WfVirtualCseExpression* to) { to->expandedExpression = CreateField(from->expandedExpression); CopyFields(static_cast(from), static_cast(to)); } void VirtualCseExpressionVisitor::CopyFields(WfExpression* from, WfExpression* to) { to->codeRange = from->codeRange; } void VirtualCseExpressionVisitor::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(from), static_cast(to)); } void VirtualCseExpressionVisitor::CopyFields(WfMixinCastExpression* from, WfMixinCastExpression* to) { to->type = CreateField(from->type); to->expression = CreateField(from->expression); CopyFields(static_cast(from), static_cast(to)); } void VirtualCseExpressionVisitor::CopyFields(WfExpectedTypeCastExpression* from, WfExpectedTypeCastExpression* to) { to->strategy = from->strategy; to->expression = CreateField(from->expression); CopyFields(static_cast(from), static_cast(to)); } void VirtualCseExpressionVisitor::CopyFields(WfCoOperatorExpression* from, WfCoOperatorExpression* to) { to->name.codeRange = from->name.codeRange; to->name.tokenIndex = from->name.tokenIndex; to->name.value = from->name.value; CopyFields(static_cast(from), static_cast(to)); } // Visitor Members ----------------------------------- void VirtualCseExpressionVisitor::Visit(WfBindExpression* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } void VirtualCseExpressionVisitor::Visit(WfNewCoroutineExpression* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } void VirtualCseExpressionVisitor::Visit(WfMixinCastExpression* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } void VirtualCseExpressionVisitor::Visit(WfExpectedTypeCastExpression* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } void VirtualCseExpressionVisitor::Visit(WfCoOperatorExpression* node) { auto newNode = vl::MakePtr(); 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(from), static_cast(to)); } void ModuleUsingFragmentVisitor::CopyFields(WfModuleUsingFragment* from, WfModuleUsingFragment* to) { to->codeRange = from->codeRange; } void ModuleUsingFragmentVisitor::CopyFields(WfModuleUsingWildCardFragment* from, WfModuleUsingWildCardFragment* to) { CopyFields(static_cast(from), static_cast(to)); } // Visitor Members ----------------------------------- void ModuleUsingFragmentVisitor::Visit(WfModuleUsingNameFragment* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } void ModuleUsingFragmentVisitor::Visit(WfModuleUsingWildCardFragment* node) { auto newNode = vl::MakePtr(); CopyFields(node, newNode.Obj()); this->result = newNode; } /*********************************************************************** ModuleVisitor ***********************************************************************/ vl::Ptr ModuleVisitor::CreateField(vl::Ptr from) { auto to = vl::MakePtr(); 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, listItem, from->paths) { to->paths.Add(CreateField(listItem)); } FOREACH(vl::Ptr, listItem, from->declarations) { to->declarations.Add(CreateField(listItem)); } to->codeRange = from->codeRange; } void ModuleVisitor::CopyFields(WfModuleUsingPath* from, WfModuleUsingPath* to) { FOREACH(vl::Ptr, listItem, from->items) { to->items.Add(CreateField(listItem)); } to->codeRange = from->codeRange; } void ModuleVisitor::CopyFields(WfModuleUsingItem* from, WfModuleUsingItem* to) { FOREACH(vl::Ptr, listItem, from->fragments) { to->fragments.Add(CreateField(listItem)); } to->codeRange = from->codeRange; } // CreateField --------------------------------------- vl::Ptr ModuleVisitor::CreateField(vl::Ptr from) { if (!from) return nullptr; auto to = vl::MakePtr(); CopyFields(from.Obj(), to.Obj()); return to; } vl::Ptr ModuleVisitor::CreateField(vl::Ptr from) { if (!from) return nullptr; auto to = vl::MakePtr(); CopyFields(from.Obj(), to.Obj()); return to; } // CreateField (virtual) ----------------------------- vl::Ptr ModuleVisitor::CreateField(vl::Ptr from) { if (!from) return nullptr; from->Accept(static_cast(this)); return this->result.Cast(); } vl::Ptr ModuleVisitor::CreateField(vl::Ptr from) { if (!from) return nullptr; from->Accept(static_cast(this)); return this->result.Cast(); } vl::Ptr ModuleVisitor::CreateField(vl::Ptr from) { if (!from) return nullptr; from->Accept(static_cast(this)); return this->result.Cast(); } vl::Ptr ModuleVisitor::CreateField(vl::Ptr from) { if (!from) return nullptr; from->Accept(static_cast(this)); return this->result.Cast(); } vl::Ptr ModuleVisitor::CreateField(vl::Ptr from) { if (!from) return nullptr; from->Accept(static_cast(this)); return this->result.Cast(); } // Dispatch (virtual) -------------------------------- vl::Ptr ModuleVisitor::Dispatch(WfVirtualCfeExpression* node) { node->Accept(static_cast(this)); return this->result; } vl::Ptr ModuleVisitor::Dispatch(WfVirtualCseExpression* node) { node->Accept(static_cast(this)); return this->result; } vl::Ptr ModuleVisitor::Dispatch(WfVirtualCseStatement* node) { node->Accept(static_cast(this)); return this->result; } vl::Ptr ModuleVisitor::Dispatch(WfCoroutineStatement* node) { node->Accept(static_cast(this)); return this->result; } vl::Ptr ModuleVisitor::Dispatch(WfStateMachineStatement* node) { node->Accept(static_cast(this)); return this->result; } vl::Ptr ModuleVisitor::Dispatch(WfVirtualCfeDeclaration* node) { node->Accept(static_cast(this)); return this->result; } vl::Ptr ModuleVisitor::Dispatch(WfVirtualCseDeclaration* node) { node->Accept(static_cast(this)); return this->result; } } } } /*********************************************************************** .\EXPRESSION\WFEXPRESSION_EMPTY.CPP ***********************************************************************/ /*********************************************************************** This file is generated by: Vczh Parser Generator From parser definition:WfExpression.parser.txt Licensed under https://github.com/vczh-libraries/License ***********************************************************************/ 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(WfObservableListType* 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(WfVirtualCfeExpression* node) { Dispatch(node); } void ExpressionVisitor::Visit(WfVirtualCseExpression* 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(WfGotoStatement* node) { } void StatementVisitor::Visit(WfVariableStatement* node) { } void StatementVisitor::Visit(WfExpressionStatement* node) { } void StatementVisitor::Visit(WfVirtualCseStatement* node) { Dispatch(node); } void StatementVisitor::Visit(WfCoroutineStatement* node) { Dispatch(node); } void StatementVisitor::Visit(WfStateMachineStatement* 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(WfVirtualCfeDeclaration* node) { Dispatch(node); } void DeclarationVisitor::Visit(WfVirtualCseDeclaration* node) { Dispatch(node); } /*********************************************************************** VirtualCfeDeclarationVisitor ***********************************************************************/ // Visitor Members ----------------------------------- void VirtualCfeDeclarationVisitor::Visit(WfAutoPropertyDeclaration* node) { } void VirtualCfeDeclarationVisitor::Visit(WfCastResultInterfaceDeclaration* node) { } /*********************************************************************** VirtualCseDeclarationVisitor ***********************************************************************/ // Visitor Members ----------------------------------- void VirtualCseDeclarationVisitor::Visit(WfStateMachineDeclaration* node) { } /*********************************************************************** VirtualCseStatementVisitor ***********************************************************************/ // Visitor Members ----------------------------------- void VirtualCseStatementVisitor::Visit(WfForEachStatement* node) { } void VirtualCseStatementVisitor::Visit(WfSwitchStatement* node) { } void VirtualCseStatementVisitor::Visit(WfCoProviderStatement* node) { } /*********************************************************************** CoroutineStatementVisitor ***********************************************************************/ // Visitor Members ----------------------------------- void CoroutineStatementVisitor::Visit(WfCoPauseStatement* node) { } void CoroutineStatementVisitor::Visit(WfCoOperatorStatement* node) { } /*********************************************************************** StateMachineStatementVisitor ***********************************************************************/ // Visitor Members ----------------------------------- void StateMachineStatementVisitor::Visit(WfStateSwitchStatement* node) { } void StateMachineStatementVisitor::Visit(WfStateInvokeStatement* node) { } /*********************************************************************** VirtualCfeExpressionVisitor ***********************************************************************/ // Visitor Members ----------------------------------- void VirtualCfeExpressionVisitor::Visit(WfFormatExpression* node) { } /*********************************************************************** VirtualCseExpressionVisitor ***********************************************************************/ // Visitor Members ----------------------------------- void VirtualCseExpressionVisitor::Visit(WfBindExpression* node) { } void VirtualCseExpressionVisitor::Visit(WfNewCoroutineExpression* node) { } void VirtualCseExpressionVisitor::Visit(WfMixinCastExpression* node) { } void VirtualCseExpressionVisitor::Visit(WfExpectedTypeCastExpression* node) { } void VirtualCseExpressionVisitor::Visit(WfCoOperatorExpression* node) { } /*********************************************************************** ModuleUsingFragmentVisitor ***********************************************************************/ // Visitor Members ----------------------------------- void ModuleUsingFragmentVisitor::Visit(WfModuleUsingNameFragment* node) { } void ModuleUsingFragmentVisitor::Visit(WfModuleUsingWildCardFragment* node) { } } } } /*********************************************************************** .\EXPRESSION\WFEXPRESSION_PARSER.CPP ***********************************************************************/ /*********************************************************************** This file is generated by: Vczh Parser Generator From parser definition:WfExpression.parser.txt Licensed under https://github.com/vczh-libraries/License ***********************************************************************/ namespace vl { namespace workflow { /*********************************************************************** ParserText ***********************************************************************/ const wchar_t* const parserTextBuffer[] = { 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 ObservableListType : 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 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"//////////////////////////////////////////////////////////////////" L"\r\n" , L"// AST (Class)" 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"//////////////////////////////////////////////////////////////////" L"\r\n" , L"// AST (Enum)" 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"//////////////////////////////////////////////////////////////////" L"\r\n" , L"// AST (Struct)" 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 (Virtual Context Free Expandable Declarations)" L"\r\n" , L"//////////////////////////////////////////////////////////////////" L"\r\n" , L"" L"\r\n" , L"class VirtualCfeDeclaration : 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 : VirtualCfeDeclaration" 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 : VirtualCfeDeclaration" 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 (Virtual Context Sensitive Expandable Declarations)" L"\r\n" , L"//////////////////////////////////////////////////////////////////" L"\r\n" , L"" L"\r\n" , L"class VirtualCseDeclaration : 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"class StateInput" L"\r\n" , L"{" L"\r\n" , L"\ttoken\t\t\t\t\tname;" L"\r\n" , L"\tFunctionArgument[]\t\targuments;" L"\r\n" , L"}" L"\r\n" , L"" L"\r\n" , L"class StateDeclaration" L"\r\n" , L"{" L"\r\n" , L"\ttoken\t\t\t\t\tname;" 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 StateMachineDeclaration : VirtualCseDeclaration" L"\r\n" , L"{" L"\r\n" , L"\tStateInput[]\t\t\tinputs;" L"\r\n" , L"\tStateDeclaration[]\t\tstates;" 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"\ttoken\t\t\t\t\tendLabel;" L"\r\n" , L"}" L"\r\n" , L"" L"\r\n" , L"class GotoStatement : Statement" L"\r\n" , L"{" L"\r\n" , L"\ttoken\t\t\t\t\tlabel;" 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 (Virtual Context Sensitive Expandable Statements)" L"\r\n" , L"//////////////////////////////////////////////////////////////////" L"\r\n" , L"" L"\r\n" , L"class VirtualCseStatement : 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 : VirtualCseStatement" 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 : VirtualCseStatement" 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 : VirtualCseStatement" 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 (Coroutine Statements)" 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 (State Machine Statements)" L"\r\n" , L"//////////////////////////////////////////////////////////////////" L"\r\n" , L"" L"\r\n" , L"enum StateSwitchType" L"\r\n" , L"{" L"\r\n" , L"\tDefault," L"\r\n" , L"\tPass," L"\r\n" , L"\tPassAndReturn," L"\r\n" , L"\tIgnore," L"\r\n" , L"\tIgnoreAndReturn," L"\r\n" , L"}" L"\r\n" , L"" L"\r\n" , L"enum StateInvokeType" L"\r\n" , L"{" L"\r\n" , L"\tGoto," L"\r\n" , L"\tPush," L"\r\n" , L"}" L"\r\n" , L"" L"\r\n" , L"class StateMachineStatement : Statement" L"\r\n" , L"{" L"\r\n" , L"}" L"\r\n" , L"" L"\r\n" , L"class StateSwitchArgument" 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 StateSwitchCase" L"\r\n" , L"{" L"\r\n" , L"\ttoken\t\t\t\t\tname;" L"\r\n" , L"\tStateSwitchArgument[]\targuments;" L"\r\n" , L"\tStatement\t\t\t\tstatement;" L"\r\n" , L"}" L"\r\n" , L"" L"\r\n" , L"class StateSwitchStatement : StateMachineStatement" L"\r\n" , L"{" L"\r\n" , L"\tStateSwitchType\t\t\ttype;" L"\r\n" , L"\tStateSwitchCase[]\t\tcaseBranches;" L"\r\n" , L"}" L"\r\n" , L"" L"\r\n" , L"class StateInvokeStatement : StateMachineStatement" L"\r\n" , L"{" L"\r\n" , L"\tStateInvokeType\t\t\ttype;" L"\r\n" , L"\ttoken\t\t\t\t\tname;" 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"\tFlagAnd," L"\r\n" , L"\tFlagOr," 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 (Virtual Context Free Expandable Expressions)" L"\r\n" , L"//////////////////////////////////////////////////////////////////" L"\r\n" , L"" L"\r\n" , L"class VirtualCfeExpression : 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 FormatExpression : VirtualCfeExpression" 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"//////////////////////////////////////////////////////////////////" L"\r\n" , L"// AST (Virtual Context Sensitive Expandable Expressions)" L"\r\n" , L"//////////////////////////////////////////////////////////////////" L"\r\n" , L"" L"\r\n" , L"class VirtualCseExpression : 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 : VirtualCseExpression" 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 NewCoroutineExpression : VirtualCseExpression" 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 : VirtualCseExpression" 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 ExpectedTypeCastExpression : VirtualCseExpression" L"\r\n" , L"{" L"\r\n" , L"\tTypeCastingStrategy\t\tstrategy;" L"\r\n" , L"\tExpression\t\t\t\texpression;" L"\r\n" , L"}" L"\r\n" , L"" L"\r\n" , L"class CoOperatorExpression : VirtualCseExpression" 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"//////////////////////////////////////////////////////////////////" 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 JOIN = \"&\";" L"\r\n" , L"token INTERSECTION = \"/|\";" L"\r\n" , L"token LE = \"//=\";" 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_GOTO = \"goto\";" 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 STATE_MACHINE = \"/$state_machine\";" L"\r\n" , L"token STATE_INPUT = \"/$state_input\";" L"\r\n" , L"token STATE_SWITCH = \"/$switch\";" L"\r\n" , L"token STATE_GOTO = \"/$goto_state\";" L"\r\n" , L"token STATE_PUSH = \"/$push_state\";" L"\r\n" , L"token STATE_DECL = \"/$state\";" 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= \"observe\" _Type : element \"[\" \"]\" as ObservableListType" 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= \"$\" \".\" NAME : name as CoOperatorExpression" 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} | {_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= _ExpPrimitive : expression \"as\" \"*\" as ExpectedTypeCastExpression 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= \"cast\" \"*\" _Exp0 : expression as ExpectedTypeCastExpression 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 = \"FlagAnd\"}" L"\r\n" , L"\t= _Exp3 : first \"|\" _Exp2 : second as BinaryExpression with {op = \"FlagOr\"}" 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} [NAME : endLabel \":\" \";\"] \"}\" 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;" 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= [\"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 _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 StateSwitchStatement _StateSwitchHead" L"\r\n" , L"\t= \"$switch\" \"(\" \"raise\" \")\" as StateSwitchStatement with {type = \"Default\"}" L"\r\n" , L"\t= \"$switch\" \"(\" \"continue\" \")\" as StateSwitchStatement with {type = \"Pass\"}" L"\r\n" , L"\t= \"$switch\" \"(\" \"continue\" \",\" \"return\" \")\" as StateSwitchStatement with {type = \"PassAndReturn\"}" L"\r\n" , L"\t= \"$switch\" \"(\" \")\" as StateSwitchStatement with {type = \"Ignore\"}" L"\r\n" , L"\t= \"$switch\" \"(\" \"return\" \")\" as StateSwitchStatement with {type = \"IgnoreAndReturn\"}" L"\r\n" , L"\t;" L"\r\n" , L"" L"\r\n" , L"rule StateSwitchArgument _StateSwitchArgument" L"\r\n" , L"\t= NAME : name as StateSwitchArgument" L"\r\n" , L"\t;" L"\r\n" , L"" L"\r\n" , L"rule StateSwitchCase _StateSwitchCase" L"\r\n" , L"\t= \"case\" NAME : name \"(\" [_StateSwitchArgument : arguments {\",\" _StateSwitchArgument : arguments}] \")\" \":\" _Block : statement as StateSwitchCase" L"\r\n" , L"\t;" L"\r\n" , L"" L"\r\n" , L"rule Statement _StateStatement" L"\r\n" , L"\t= !_StateSwitchHead \"{\" {_StateSwitchCase : caseBranches} \"}\"" L"\r\n" , L"\t= ( (\"$goto_state\" with {type = \"Goto\"}) | (\"$push_state\" with {type = \"Push\"}) )" L"\r\n" , L"\t\tNAME : name \"(\" [_Expression : arguments {\",\" _Expression : arguments}] \")\" \";\" as StateInvokeStatement" 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= \"goto\" NAME : label \";\" as GotoStatement" 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= !_StateStatement" L"\r\n" , L"\t;" L"\r\n" , L"" L"\r\n" , L"//////////////////////////////////////////////////////////////////" L"\r\n" , L"// Rule (Declaration -- State Machine)" L"\r\n" , L"//////////////////////////////////////////////////////////////////" L"\r\n" , L"" L"\r\n" , L"rule StateInput _StateInput" L"\r\n" , L"\t= \"$state_input\" NAME : name \"(\" [_FunctionArgument : arguments {\",\" _FunctionArgument : arguments}] \")\" \";\" as StateInput" L"\r\n" , L"\t;" L"\r\n" , L"" L"\r\n" , L"rule StateDeclaration _StateDecl" L"\r\n" , L"\t= \"$state\" (\"default\" | NAME : name) \"(\" [_FunctionArgument : arguments {\",\" _FunctionArgument : arguments}] \")\" _Block : statement as StateDeclaration" L"\r\n" , L"\t;" L"\r\n" , L"" L"\r\n" , L"rule StateMachineDeclaration _StateMachine" L"\r\n" , L"\t= \"$state_machine\" \"{\" { _StateInput : inputs | _StateDecl : states} \"}\" as StateMachineDeclaration" 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} [_StateMachine : 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;" L"\r\n" }; const vint lengthTextBuffer[] = { 2, 68, 21, 68, 2, 22, 3, 10, 12, 10, 3, 2, 19, 3, 26, 3, 2, 12, 3, 3, 2, 18, 3, 3, 2, 17, 3, 3, 2, 17, 3, 22 , 18, 23, 3, 2, 19, 3, 29, 18, 30, 3, 2, 68, 16, 68, 2, 25, 3, 8, 10, 13, 7, 8, 9, 10, 10, 8, 8, 3, 2, 29, 3, 28 , 3, 2, 31, 3, 18, 3, 2, 28, 3, 18, 3, 2, 29, 3, 20, 3, 2, 32, 3, 20, 3, 2, 27, 3, 20, 3, 2, 29, 3, 20, 3, 2 , 21, 3, 12, 12, 3, 2, 22, 3, 32, 16, 18, 3, 2, 33, 3, 20, 3, 2, 27, 3, 19, 24, 3, 2, 24, 3, 19, 18, 3, 2, 68, 23 , 68, 2, 42, 3, 32, 3, 2, 24, 3, 29, 18, 17, 3, 2, 24, 3, 9, 13, 3, 2, 41, 3, 32, 33, 23, 26, 3, 2, 41, 3, 17, 28 , 3, 2, 38, 3, 24, 3, 2, 41, 3, 17, 20, 20, 31, 3, 2, 68, 16, 68, 2, 16, 3, 9, 13, 3, 2, 22, 3, 13, 13, 10, 3, 2 , 27, 3, 17, 28, 3, 2, 44, 3, 37, 46, 33, 26, 3, 2, 43, 3, 26, 3, 2, 38, 3, 21, 37, 24, 56, 3, 2, 68, 15, 68, 2, 15 , 3, 10, 8, 3, 2, 19, 3, 12, 16, 3, 2, 28, 3, 18, 3, 2, 16, 3, 29, 18, 23, 20, 40, 3, 2, 37, 3, 20, 23, 3, 2, 68 , 17, 68, 2, 20, 3, 29, 18, 17, 3, 2, 39, 3, 28, 3, 2, 68, 55, 68, 2, 43, 3, 40, 3, 2, 14, 3, 12, 12, 3, 2, 16, 3 , 14, 17, 3, 2, 55, 3, 17, 27, 30, 28, 3, 2, 62, 3, 21, 24, 3, 2, 68, 60, 68, 2, 43, 3, 40, 3, 2, 18, 3, 18, 33, 3 , 2, 24, 3, 18, 33, 26, 3, 2, 55, 3, 25, 30, 3, 2, 68, 21, 68, 2, 34, 3, 3, 2, 37, 3, 3, 2, 35, 3, 28, 3, 2, 35 , 3, 28, 3, 2, 43, 3, 28, 3, 2, 31, 3, 17, 18, 28, 27, 28, 3, 2, 34, 3, 27, 26, 3, 2, 32, 3, 35, 18, 31, 33, 3, 2 , 34, 3, 29, 22, 3, 2, 33, 3, 19, 3, 2, 37, 3, 33, 3, 2, 39, 3, 28, 3, 2, 68, 58, 68, 2, 39, 3, 34, 3, 2, 23, 3 , 10, 12, 3, 2, 46, 3, 18, 31, 28, 26, 3, 2, 18, 3, 28, 26, 3, 2, 45, 3, 28, 31, 30, 3, 2, 49, 3, 18, 26, 3, 2, 68 , 31, 68, 2, 38, 3, 3, 2, 45, 3, 26, 3, 2, 48, 3, 21, 20, 28, 3, 2, 68, 35, 68, 2, 22, 3, 11, 8, 17, 10, 19, 3, 2 , 22, 3, 8, 8, 3, 2, 41, 3, 3, 2, 27, 3, 18, 3, 2, 23, 3, 18, 35, 26, 3, 2, 52, 3, 26, 35, 3, 2, 52, 3, 26, 18 , 28, 3, 2, 68, 22, 68, 2, 35, 3, 3, 2, 43, 3, 18, 3, 2, 40, 3, 18, 3, 2, 42, 3, 18, 3, 2, 44, 3, 22, 3, 2, 37 , 3, 24, 18, 3, 2, 36, 3, 24, 18, 3, 2, 19, 3, 8, 8, 9, 3, 2, 38, 3, 24, 3, 2, 39, 3, 19, 3, 2, 38, 3, 19, 3 , 2, 37, 3, 35, 3, 2, 20, 3, 12, 12, 7, 3, 2, 36, 3, 22, 25, 3, 2, 21, 3, 10, 9, 11, 10, 14, 7, 7, 7, 7, 7, 7 , 7, 7, 6, 6, 6, 6, 6, 6, 7, 7, 6, 3, 2, 37, 3, 23, 23, 24, 3, 2, 19, 3, 18, 23, 3, 2, 34, 3, 29, 28, 3, 2 , 33, 3, 27, 28, 29, 3, 2, 20, 3, 13, 13, 3, 2, 36, 3, 23, 33, 21, 31, 3, 2, 17, 3, 6, 9, 3, 2, 41, 3, 22, 25, 28 , 3, 2, 27, 3, 21, 23, 3, 2, 42, 3, 35, 3, 2, 36, 3, 28, 17, 3, 2, 26, 3, 10, 8, 3, 2, 42, 3, 33, 28, 17, 3, 2 , 18, 3, 10, 13, 10, 13, 3, 2, 42, 3, 23, 28, 17, 3, 2, 41, 3, 17, 3, 2, 47, 3, 28, 3, 2, 42, 3, 23, 26, 3, 2, 42 , 3, 23, 25, 3, 2, 18, 3, 17, 19, 3, 2, 38, 3, 24, 30, 18, 28, 25, 3, 2, 35, 3, 26, 28, 3, 2, 39, 3, 33, 3, 2, 39 , 3, 17, 28, 3, 2, 43, 3, 17, 56, 3, 2, 68, 54, 68, 2, 41, 3, 36, 3, 2, 47, 3, 41, 3, 2, 68, 59, 68, 2, 41, 3, 36 , 3, 2, 45, 3, 28, 3, 2, 53, 3, 18, 26, 3, 2, 50, 3, 17, 28, 3, 2, 57, 3, 33, 28, 3, 2, 51, 3, 18, 3, 2, 68, 17 , 68, 2, 27, 3, 3, 2, 53, 3, 18, 3, 2, 57, 3, 3, 2, 23, 3, 35, 3, 2, 23, 3, 28, 3, 2, 17, 3, 10, 8, 3, 2, 14 , 3, 28, 18, 28, 32, 3, 2, 68, 10, 68, 2, 19, 19, 18, 19, 19, 18, 19, 28, 20, 20, 18, 18, 20, 20, 22, 29, 29, 31, 20, 24, 20 , 18, 26, 27, 26, 27, 28, 29, 17, 2, 27, 31, 37, 25, 27, 29, 31, 31, 27, 27, 2, 32, 28, 28, 28, 28, 26, 28, 29, 29, 29, 32, 28 , 26, 32, 28, 26, 26, 26, 30, 30, 34, 30, 30, 36, 26, 34, 34, 30, 28, 32, 38, 34, 34, 32, 26, 30, 34, 30, 36, 32, 28, 38, 28, 32 , 36, 32, 30, 38, 34, 30, 32, 34, 38, 32, 40, 34, 30, 2, 42, 38, 34, 36, 36, 31, 2, 44, 36, 44, 42, 30, 2, 30, 34, 26, 24, 56 , 66, 2, 29, 53, 2, 68, 16, 68, 2, 17, 48, 52, 58, 46, 48, 50, 52, 52, 48, 48, 33, 98, 42, 45, 40, 46, 81, 60, 89, 49, 41, 19 , 4, 2, 68, 22, 68, 2, 40, 72, 4, 2, 31, 55, 4, 2, 36, 45, 62, 84, 87, 48, 4, 2, 31, 54, 54, 56, 41, 40, 39, 29, 39, 49 , 25, 58, 47, 121, 12, 89, 45, 85, 22, 101, 109, 93, 186, 205, 111, 63, 63, 95, 28, 64, 52, 68, 31, 5, 6, 7, 34, 45, 45, 6, 66, 75 , 5, 99, 95, 58, 74, 93, 92, 47, 24, 4, 2, 23, 19, 66, 66, 63, 95, 91, 4, 2, 23, 11, 75, 4, 23, 11, 75, 75, 75, 4, 23, 11 , 75, 75, 79, 78, 4, 23, 11, 77, 77, 4, 23, 11, 74, 74, 75, 75, 75, 75, 4, 23, 11, 77, 4, 23, 11, 77, 4, 23, 11, 75, 4, 23 , 11, 83, 4, 24, 11, 87, 4, 24, 12, 80, 4, 2, 29, 12, 4, 2, 68, 21, 68, 2, 29, 73, 4, 2, 23, 82, 4, 2, 22, 170, 4, 2 , 34, 141, 27, 86, 71, 4, 2, 29, 60, 142, 4, 2, 28, 80, 4, 2, 44, 78, 78, 100, 69, 87, 4, 2, 47, 39, 4, 2, 39, 147, 4, 2 , 32, 64, 84, 107, 4, 2, 27, 12, 45, 46, 34, 40, 63, 61, 70, 9, 81, 146, 56, 23, 18, 21, 4, 2, 68, 40, 68, 2, 29, 125, 4, 2 , 34, 154, 4, 2, 44, 102, 4, 2, 68, 32, 68, 2, 27, 83, 4, 2, 38, 90, 4, 2, 41, 79, 4, 36, 12, 5, 47, 41, 5, 98, 79, 4 , 36, 97, 4, 2, 30, 100, 4, 2, 36, 136, 4, 2, 47, 104, 4, 42, 6, 49, 52, 5, 79, 103, 48, 4, 2, 40, 57, 4, 2, 34, 147, 4 , 2, 30, 95, 103, 104, 4, 2, 40, 40, 4, 2, 26, 104, 4, 2, 26, 155, 4, 2, 28, 113, 136, 4, 2, 33, 79, 4, 2, 32, 80, 4, 2 , 40, 12, 31, 68, 20, 31, 68, 28, 31, 71, 40, 31, 71, 4, 2, 44, 82, 4, 2, 58, 116, 4, 2, 68, 35, 68, 2, 43, 16, 15, 12, 15 , 18, 17, 12, 11, 13, 26, 4, 2, 43, 15, 19, 4, 2, 31, 56, 56, 4, 2, 31, 51, 55, 4, 2, 37, 56, 85, 4, 2, 68, 18, 68, 2 , 41, 43, 39, 4, 33, 79, 4, 33, 80, 4, 21, 6, 41, 39, 82, 4 }; const vint lengthTextBufferTotal = 35077; vl::WString WfGetParserTextBuffer() { vl::collections::Array textBuffer(lengthTextBufferTotal + 1); wchar_t* reading = &textBuffer[0]; for(vint i = 0; i < sizeof(parserTextBuffer) / sizeof(*parserTextBuffer); i++) { memcpy(reading, parserTextBuffer[i], lengthTextBuffer[i] * sizeof(wchar_t)); reading += lengthTextBuffer[i]; } *reading = 0; return &textBuffer[0]; } /*********************************************************************** SerializedTable ***********************************************************************/ const vint parserBufferLength = 180863; // 2081104 bytes before compressing const vint parserBufferBlock = 1024; const vint parserBufferRemain = 639; const vint parserBufferRows = 177; const char* const parserBuffer[] = { "\xFF\x00\x01\x82\x81\x8E\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\x0B\x93\xE7\xA5\xEF\x2F\x2D\x98\xEE\xAE\xCF\x7D\xDA\xCC\xB0\xA6\x84\xFA\xAA\xF6\x3E\xC8\x9E\xA8\xC8\xA6\xC8\xC7\xE7\x67\x42\x46\x54\x14\x61\x35\x14\x54\x7F\x8A\x7F\x74\x58\x7D\x03\x76\x79\x4F\x4E\x76\x29\x14\x1A\x4F\x08\xBE\x78\x67\x82\x4F\x42\x87\x55\x56\x5B\x5D\x52\x1D\x10\x72\x27\x15\x1F\x65\x8D\x64\x56\x07\x49\x27\xAA\x7E\x18\x56\x5A\x5C\x5E\x56\x75\xB5\x59\x74\x72\x4C\x0B\x46\x45\x8E\x55\x2B\x9C\x8E\x8A\x1C\xF0\x43\x73\x5D\x04\x27\x40\x9A\x89\x52\x6E\x35\x15\x19\x85\x24\xB3\x52\x07\x49\x4B\xAA\x7B\x4F\x4B\x6A\x47\x95\x65\x92\xDB\x5D\x72\x40\x8C\xD8\x77\x62\x4F\x6E\x06\x5C\x92\x50\x1B\x65\x30\x48\x92\x82\x4C\x75\x83\x41\x8D\x42\x6C\x8D\x87\x8B\x43\x57\x76\x6E\x7C\x34\xA7\x48\x99\x98\x10\x52\x44\x46\x45\x3D\x9A\x94\x48\x97\x03\x5C\x95\x11\x91\x6D\x18\x9F\x9B\x8C\x24\x48\x07\x4A\xA1\x01\x7F\x93\x89\x12\x8A\x66\x78\x7A\x40\x8A\xAD\x1C\xA2\x65\xAD\x70\x42\x1C\x55\x5C\x7A\x93\x48\x60\x03\x40\x61\xA5\x7E\x62\x20\x9C\x72\x73\x64\x50\x73\x40\x74\x13\x4C\x62\xA2\x8C\x73\x5A\x07\x4A\xAB\x89\x99\x43\x50\x4C\x64\x23\xA5\x57\x54\x17\x41\x7F\x64\x9C\x24\x4A\x07\x4A\xAF\xB1\xAF\x51\x7C\xA1\x23\x4C\x82\x40\x7D\x79\xA0\x43\x9B\x85\x4C\x4D\x96\x42\xB3\x46\x04\x66\x6E\x1B\x67\x09\xB4\xB1\x59\x01\x81\x46\x13\x7B\x75\x8B\xB5\x88\x53\xA6\x82\x40\x77\xB6\x72\x2D\x18\x52\xB5\x00\x89\x43\xB9\x1D\x6E\x19\xA0\x48\x88\x22\x94\x93\x7D\x86\xDA\xAC\xBE\xBA\x1B\xAB\x9A\xA2\x4A\xB3\x03\x50\xB6\xBE\x8C\xE8\xA4\x5C\x03\x49\x03\xF5\xBD\xBA\x8C\xB6\xB3\x5D\x03\x49\x0B\xC1\x47\x13\x1B\x5D\x5E\xB3\x5D\xC1\x06\x54\xC9\x12\x19\x01\xCC\x5E\x76\x41\x1B\xD7\xC2\xC4\x59\x7C\x82\x4C\x95\x6B\x66\x3E\x49\xC6\x4C\x42\x86\x49\xC9\xA5\x65\x27\x16\xCA\xAE\xC3\x8A\xCC\xC2\x40\x4C\x21\x97\xC8\x49\x1B\xC3\x4B\xC5\xCD\x74\x16\x16\x51\x1A\x61\x21\xA1\x4C\x59\x29\xC3\x49\xC8\x13\x69\x16\xA1\x5B\xCD\x23\x47\x07\x4A\xD3\x01\x4D\x11\x18\x1C\x09\xE5\xA9\xB4\x00\xE2\x6D\x14\x78\x8F\x30\xFE\x88\x85\x42\xF4\x4D\x19\x18\x1E\x6A\x66\x69\xAE\xB0\x5E\xCC\x56\x03\x49\x6B\xD1\xDF\x18\x19\xAA\x43\xD3\xBC\xD8\x02\x4D\x1F\xD9\xDC\x55\x1E\x44\xB6\x11\x47\x67\x12\xBF\x96\xBA\x75\xD7\xDC\x98\x79\xEA\x57\x1B\xA4\x6D\x33\x56\x4E\x41\x8B\xF6\xD0\xDC\xE1\x7A\xE7\x1E\x11\x18\x8B\x7C\xD1\x1A\xDF\x64\x80\xE9\x40\x97\x8E\xF8\xD1\xE4\x81\x74\x28\x13\x5F\x06\x27\x64\xEE\xDB\xE3\x65\x05\xE4\xB7\x15\xBE\x64\x10\x5A\x1C\x64\x16\xE8\xE4\xB3\x32\x69\x76\x42\xED\x93\xCB\x63\x1C\x1C\xB1\x79\xBC\xAF\x48\xFC\x82\x4E\xB2\x13\x65\x37\x13\x77\x54\x73\x0C\xD2\x49\x8A\x06\x4C\xF4\xF2\xF1\x5E\x6F\x10\x96\x1B\x65\x0A\xFF\x3C\xF3\x03\x4E\xF5\xF0\xCB\x72\x30\x63\x19\xF5\x5D\xFA\xBF\x3C\xC5\x03\x54\xCE\x12\x6A\x45\x42\xD5\xD5\xB3\x4C\x82\x4F\x12\x18\x54\x72\x16\x1D\xD0\x60\x88\xD8\x57\xFA\x28\xC1\x9E\xF8\xFC\x3E\x54\x46\xF7\xE2\x03\x2B\x73\x13\x30\x7E\x27\x32\x24\x0C\x09\x94\x62\x0C\x19\x61\x06\x7A\x33\x47\x26\x7D\x04\x9B\x20\x19\x39\x70\x7C\xB4\x62\x7C\x53\x02\x20\x32\x4E\x06\x85\x0C\x33\x11\x4D\x56\xCD\x32\x6E\x4C\x46\x51\x20\xFA\x3A\x24\x27\x3E\x20\x2A\xEF\x57\x5F\x1E\x00\x82\x23\x71\x52\x01\x0D\x1A\x54\x28\x23\xEF\x70\x0A\x46\x1F\x78\x35\xE0\x01\x21\x86\x6A\x55\x82\x38\x17\x8F\x30\x0F\xE1\x07\x0E", "\x28\x2F\x0A\x2D\x96\x58\x7C\x49\x24\x80\x00\xFA\x28\x35\x64\x1B\x2D\x5F\x0F\xBB\x5C\x85\x86\x46\x26\x8A\x4F\x85\x82\x14\xCA\x83\x25\x90\x41\x24\x4B\xA8\x34\x0D\x1D\x72\x0E\x0D\x1C\xB5\x77\x51\x01\x33\x09\x98\x54\x0C\x22\x22\x55\x59\x7C\xBF\x62\x25\xD1\x02\x29\x65\x29\x28\x0E\x28\x06\x86\x88\x12\xBE\x2C\x8A\x6C\x6A\x5A\x20\x15\x4B\x87\x5C\x40\x56\x20\x42\x95\x45\x35\x70\x0F\x26\xA3\x09\x26\x77\x43\xAE\x0E\x0E\x6F\x0B\x0E\x94\x7D\x3F\x6F\x99\x35\x20\x90\x95\x32\x69\x44\x51\x42\x90\xB2\x0E\x82\x21\x98\x9D\x3E\x26\xBD\x34\x7A\x33\x8B\x8C\x5E\x00\x15\x43\x14\x77\x09\x69\x88\x30\x5B\x44\x99\x7B\x4F\x0E\xA9\x95\x33\x55\xAD\x90\x0D\xA6\x22\x84\x49\x36\x73\x21\x46\xB5\x94\x95\x74\x11\x22\x29\xA3\x26\x39\x81\x06\x3B\x98\x7E\x91\x38\x26\xAC\x24\x5A\xEB\x73\x89\x20\x75\x9A\x44\x1D\x1D\x9C\x28\xF2\x42\x24\x62\x88\x2D\x44\x1D\x59\x6B\x6B\x41\xBF\x50\x90\xC0\x91\x21\x2E\xF3\x2E\x8A\x00\x1C\x4E\x96\xC1\x88\x0C\x32\xF4\x22\x88\x00\x14\x0D\x37\xC9\x70\x8C\x0B\xD8\x72\x20\xE6\x54\x0C\x27\x51\x15\x0D\x58\x69\x0E\x82\x03\x96\x79\x5C\x01\x30\x3B\x3D\xF0\x09\x9F\x7D\xBD\x98\x84\xA4\x55\x98\xC1\x02\x24\x0A\x39\x39\x0B\x9D\x04\x07\x25\x44\x81\x2D\x8F\x7F\x1F\x90\x00\x35\x56\x56\xD9\x06\x76\x7A\x58\x46\x26\xA3\xB6\x4F\x08\xC6\x72\x96\x7A\x5E\x82\x26\x76\x21\xA6\x0E\xAD\x0D\x82\x4E\x86\xA1\x84\x8D\x58\x3C\xA2\x3C\xE4\x93\x97\x2A\x2B\x2E\xA1\xD6\x6C\x88\x7D\x3E\x6C\x24\xFA\x72\x35\x4D\x31\x42\x7F\x33\x80\x09\x64\x9E\x80\x6A\x68\xEB\x97\xA1\x8D\x56\x09\x0D\x9F\x3A\x9C\x0D\x43\x05\x64\x35\xE7\x8C\x90\x81\x0C\xAE\xA9\x61\x31\xAB\x14\xB1\x6E\x93\x96\x81\x27\xAA\x62\x99\xA8\x55\x53\xAB\x96\x34\x80\x00\xAC\x4F\xA3\x08\x0D\xB3\xAF\x6B\xFA\x16\xAD\xA9\x61\xB0\xAB\x81\x53\x41\x97\x4D\x6D\x9F\x0A\xCA\x33\x91\x82\x34\x74\x24\x7F\x1E\xAE\x46\x02\x2D\x23\x43\x11\x29\x54\x3C\x72\x9D\x00\x27\x28\xB1\x40\x65\x07\x4F\x6F\x71\x49\x21\x35\x42\xB1\x9D\x05\xB7\x6C\x20\xA0\x20\x51\x06\x38\xB2\x19\x7F\x52\x7D\x62\x82\x26\x38\x82\xAC\x26\x4B\x30\x28\xB3\x81\x18\xB3\x0C\xFD\x27\x0E\x57\x79\x03\x2E\xCF\x81\x20\xB4\x2B\x2D\x27\x4B\x65\x03\xA2\x83\x35\xB3\x2D\x8B\x2D\xB7\x49\x30\xB9\x2A\xD9\xB0\x22\xB1\x06\x20\xBB\xFC\x6C\x06\x48\xC5\x57\x97\x26\x5D\x27\x85\x7B\x2A\x80\xA9\x2C\x60\x24\x90\x03\x24\x90\x52\x3D\xB3\xB4\x8E\x06\xB9\x21\x8B\x61\x08\x4E\x4A\xB9\x85\xA0\x0D\xBB\x50\x39\x62\x23\xC6\x34\x3D\x22\x6E\xA5\x3C\x2C\x2E\x81\x21\x76\xDB\xBB\x27\xE5\x9E\xBC\x36\xCE\xAE\x0D\x78\x81\x23\xBC\x90\x1E\x87\x0C\x38\x58\x2B\x75\x8C\x71\xB0\xF6\xA8\x87\x27\xEF\xAE\x4E\x8C\x56\x83\x20\x2B\xA3\x0E\xBE\x69\x07\x0F\xFB\x71\x74\x23\xFD\x81\x85\xBF\xC9\xAD\xBD\x77\xAB\x86\xA5\x80\x36\x75\x0C\x19\x21\x0D\x5E\x06\x8B\x85\x39\x0E\xC7\x85\x10\xCF\x43\x7F\xCC\xB0\xBF\x41\x50\xBA\x20\x84\x98\xC2\x05\xF1\x8D\x85\xE3\x80\x02\xBB\x11\xC3\xC5\x80\xC1\xA0\x25\xDA\x83\x27\xB6\x94\x7A\x97\x48\x69\xB0\x01\xF5\xB1\xC6\xBD\x2B\x96\xC6\x40\x35\xB0\x29\x84\xA3\x80\x95\x52\x34\x29\x7E\xD2\x9E\x2A\xCE\x2C\x0E\xB5\x28\x22\x22\x51\x71\x5C\x30\x0F\xED\xAD\x41\x90\x33\x29\x55\x1B\x4A\x9B\x26\xE1\x2C\x0D\x42\xC1\x20\x91\xA1\x89\x5C\x65\xB8\x2C\x2D\xD6\x40\xBB\x40\x40\xBE\x83\x4B\x4E\xB4\x24\x00\xA0\x00\x74\x42\x0A\x2C\x34\xF2\x9A\x00\x27\x38\xCD\x40\x3C\x25\xCD\x53\x50\x35\xCE\x38\xB2\x9D\xDB\x06\x23\xD0\x4C\x60\x24\x0C\x99\x21\x33\x9F\xF9\x26\x5B\xE0\x41\x26\x59\x2A\xDA\xC3\x84\x40\x3B\xC4\x16\x98\x81\x20\x82\x2A\x2C\xA5\x96\xBE\x0D\x13\xC1\x21\xC5\x6C\xAC\x2B\xA5\x80\x02\x30\xC2\x06\x36\x5B\xA5\xA2\x20\x66\x95\x27\x81\xA0\x65\x0B\x2C\x64\x23\xD5\xA9\x85\x34\x32\x4A\x8C\x36\xD3\x00\x04\x90\x56\x36\xD6\x22\x2B\xE2\xD5\x9D\x4E\xD6\x58\x94\xC6\x33\xCA\x58\xBD\xD1\xD1\x9D\x42\x43\x97\xD6\x59\xD5\x80\x1A\xB4\xB3\x2C\xC4\x36\x41\x52\xD6\x6C\xD4\x33\x0A\x35\xAC\x2E\x35\xF7\x3D\x7F\xBA\x19\x78\xD2\xBA\xB1\xB5\xBA\xAF\xB2\x22\xDB\x81\x14\xD8\x57\xD6\xD8\xD8\xF7\x5E\x7F\xA7\x12\xF2\x45\xD9\x00\x18\xB2\x18\x5A\xC5\xA3\x72\xC2\x27\xDC\xA7\x29\x37\x6A\x6B\xDC\xDA\x77\xCA\x2B\xBE\x00\x03\xBC\x78\x66\xB2\x0F\xB9\x36\xD9\x20\xF8\xD4\x0D\xBA\xFB\xDA\xDA\x76\xEB\x80\xE0\x1B\x6F\xD6\x85\x74\x05\xDF\xD1\x0A\xD9\xDF\xD7\xCC\xE2\xA5\x0E\xED\xDA\xA5\x15\xC0\x00\x17\xD9\xC3\x86\xE4\x0D\xC2\x83\xD6\xE5\x34\xE8\xDA\xDD\xB6\x9B\xED\xDE\x01", "\xCA\x29\xCC\x00\x18\xC5\x6E\xA0\x63\x97\xE4\x2D\x76\x5A\x30\xF2\xE6\x8E\xA2\x25\x9C\x2E\x76\xE7\x37\xD6\x43\xD3\x40\x03\xDC\x77\x28\xAF\xCC\x98\xBB\xA2\x42\x72\x08\xA4\xB6\x89\x82\x20\xB7\x3B\xFF\x1F\xB0\xCA\xED\x74\x5B\x42\xEA\x20\x44\xF8\x8C\x5F\xA3\x21\xCE\xE9\x20\x3B\x85\xDF\xD2\xC9\xB8\xB3\xB3\xDC\x38\xD7\x6F\x78\xD5\x3D\xE0\x48\x53\xE1\x21\x79\xD4\x2E\x56\x65\xFC\xEB\xD9\xDF\xEA\xEC\xF9\x96\x49\x20\xE4\xA1\x3F\x78\x67\xB0\x5D\xB9\xC8\x7B\x85\x3D\xE2\x23\x81\xB9\x4D\xCA\x39\x15\xA5\xEB\x02\x54\xEE\xBF\xA0\x26\x9B\x80\x14\x63\x42\x8B\xEB\x45\x9F\xE2\x59\xF1\xBF\xF5\xE9\xE7\x02\x2B\x0E\xA6\x93\xF1\xA1\xCA\xE9\xE9\xF2\x98\xE4\x21\x8E\xF3\x20\xE2\xCF\xFA\xEA\x6B\x3E\x21\xF4\x00\x1A\xF9\x2F\x45\xB7\x72\x43\xF8\x2E\x3C\xD7\x15\xDE\xD0\x00\x10\xD2\xE4\x93\xC5\xA6\x59\xF7\x3D\x3C\xFD\x33\xF4\xD3\xAA\xF0\xEB\x5C\x3A\xA0\xF7\xDE\xDE\x46\x5B\x6C\xE0\x01\xB1\xA4\x41\xEF\xA6\x28\x94\xF7\xF9\x27\xF8\x5D\x96\x27\xEB\x80\x03\xD4\x27\x14\x83\xFB\xF3\xEB\x36\xF9\xFD\x13\xFC\x0E\x50\x66\x21\xF8\xF3\x72\x0F\xEC\xD6\x6F\x8F\xEA\x24\x42\x81\x7A\xA3\xE3\xE4\xFB\xD3\xAF\x47\xEE\xF8\xDD\x69\xF0\x42\x09\x54\x47\xFB\x43\xA9\x65\xA4\xA3\xEB\x9C\xE2\xF4\xFF\x0D\x11\x23\x21\x72\x0E\x2D\xC1\x73\x7A\x57\x67\x2C\x1A\x27\x42\x01\x87\x7F\xBC\x64\x07\xEE\x7F\x7D\xDA\x73\x7F\x00\x0B\x64\x85\x7F\x4A\x24\x23\x00\x27\x18\x81\x01\x12\x49\xAC\x57\x80\x25\x4A\x21\x84\x7B\x26\x1F\x21\x22\xC6\x64\x07\x6A\x62\x10\xC2\x51\x16\xC5\x56\x22\x28\x20\x82\x6A\x2B\x23\x2B\x49\x7C\xCB\x75\x65\x73\x14\x4F\x01\x1C\x3C\x14\x82\x82\x60\x7F\x4D\x01\x13\x5D\xA2\x54\x76\x35\x8D\x82\x2A\x2F\x82\x1E\x24\x61\x66\x5E\x76\x5B\x61\x82\x3B\x2E\x64\xCD\x77\x3D\x42\x83\x81\x5C\x6A\x83\x75\x75\x7A\x78\x73\x70\x7B\x75\x70\x2C\x89\x10\x38\x81\x85\x30\x85\x77\x81\x78\x77\x5C\x8E\x21\x15\x56\x83\x00\x0B\x85\x4A\x85\x84\x97\x7E\x74\xA2\x73\x73\x4C\x14\x86\x66\x84\x84\x6C\x21\x79\x0F\x8D\x80\x73\x1A\x54\x2E\x8C\x64\xBF\x74\x45\x32\x84\x82\xCC\x74\x7A\x77\x70\x00\x3B\x89\x10\xE0\x64\x5D\x40\x85\x25\x09\x1B\x31\x0F\x7F\x87\x79\x74\x70\x7E\x87\x88\x57\x29\x86\x09\x1A\x73\x34\x5B\x39\x8F\x80\x26\x62\x2F\x7D\x61\x7B\x58\xA1\x6F\x58\x80\x51\x10\x69\x28\x87\x81\x85\x48\x62\x74\x88\x30\x1D\x84\x76\x8E\x89\x6D\x45\x78\x89\x8E\x88\x55\x88\x3C\x8C\x8D\x55\x90\x5F\x88\x70\x82\x07\x41\x6A\x86\x00\x02\x7C\xB0\x8D\x89\x80\x89\x8A\x52\x82\x87\x49\x71\x10\xEF\x73\x71\x75\x8F\x57\x42\x13\x58\x76\x2C\x18\x69\x69\x58\x02\x1C\x58\x75\x52\x12\xA7\x8B\x8B\xC6\x84\x59\xD6\x21\x7E\x03\x11\x7E\x77\x49\x17\x60\x28\x85\x3A\x44\x89\x89\x20\x28\xA1\x81\x5D\xA3\x8F\x83\xA5\x83\x89\x5D\x20\x29\xDE\x83\x85\x8A\x86\x85\xA8\x7A\x8D\x9A\x35\x8E\xDD\x83\x22\x2B\x47\x82\x01\x10\x5C\x49\x36\x19\x4D\x8F\x85\x00\x01\x29\xB5\x81\x89\x99\x7B\x79\x34\x7C\x8D\xF9\x87\x8E\xA0\x76\x8B\xB8\x8C\x14\xF0\x68\x59\x91\x28\x38\x99\x8A\x7C\x63\x73\x8E\x64\x17\x90\xE6\x8B\x28\x8A\x14\x60\x02\x16\x45\x7B\x47\x29\xB3\x2A\x14\x4D\x80\x91\xEF\x82\x29\x8A\x1A\x7A\xAC\x78\x68\x0F\x97\x28\x11\x9E\x91\x96\x15\x80\x6C\x82\x13\x1C\x91\x90\x12\x96\x19\xD5\x70\x00\x83\x60\x28\xDD\x44\x16\x1F\x76\x3B\x09\x9A\x18\xDC\x38\x29\x32\x28\x92\x51\x72\x6B\x25\x90\x2A\xA2\x21\x42\xD4\x82\x10\xE1\x72\x71\x95\x42\x77\xE8\x79\x8F\x8D\x51\x83\xBF\x8A\x7C\x7C\x84\x83\xE7\x76\x66\x4A\x9A\x2A\x75\x7B\x90\x3E\x8E\x5B\xD6\x51\x95\x7E\x69\x28\x4B\x98\x8E\xAC\x80\x00\x8B\x87\x85\x9C\x72\x67\x90\x2D\x95\x03\x9C\x8F\x6B\x81\x75\x1E\x53\x10\x1E\x5E\x16\xB3\x26\x40\x1A\x58\x2B\x8D\x6D\x3E\x9A\x8C\x3B\x23\x7D\x51\xAF\x20\x29\xB2\x2C\x15\x70\x91\x42\x66\x36\x2D\x0B\x9A\x62\x9C\x6D\x2A\x79\x91\x2C\x6F\x9C\x74\x7F\x92\x4F\x2B\x9C\x22\xA9\x5D\x81\x73\x3E\x56\xC1\x2C\x69\xDE\x21\x98\x9B\x84\x12\xB5\x70\x2D\xD2\x2E\x46\xC9\x89\x10\x29\x84\x5C\x51\x78\x78\xDA\x2C\x2D\xC2\x48\x89\x3C\x80\x96\x6F\x02\x16\x19\x9C\x62\xA0\x90\x00\xE4\x25\x04\xDD\x2F\x7D\xC9\x74\x06\x4D\x59\x9A\x2C\x4B\x9A\xAD\x9F\x9A\x0D\x89\x7F\xCB\x88\x7B\x06\x4B\x4E\xB6\x92\x9A\xEA\x4F\x7D\x3C\x93\x96\xE3\x20\x9C\xC8\x7D\x94\xC1\x87\x94\xC9\x4B\x95\xAC\x9E\x15\xE6\x25\x59\x54\x47\x99\xBB\x96\x97\xB9\x75\x99\x48\x92\x95\xE4\x2F\x9C\x9B\x91\x5C\x02\x13\x5C\x2B\x8D\x77\x49\x96\x04\xD0\x6E\x06\x16\x87\x6B\xA5\x97\x95\xE2\x64\x9C", "\x02\x12\x9E\x07\x3A\x14\xE5\x96\x11\xC3\x9A\x95\x94\x76\x30\xF7\x2F\x9E\x74\x0A\x7A\x45\x61\x75\xFE\x7C\x9A\xE3\x9C\x94\x09\x14\x6C\x6E\x00\x12\x79\x0D\x06\x49\x3E\x98\x47\x62\x81\xEC\x97\x2F\xFE\x97\x1C\x52\x6F\x94\xC7\x6E\x81\x4D\x4B\x9E\xFD\x95\x95\xE7\x9D\x90\x59\x9F\x98\x58\x64\x9F\x32\x2B\x8A\x1C\x32\x78\xEA\x83\x93\x18\xA8\x80\x1A\xAA\x14\xFB\x86\x5B\x4F\x76\x80\x21\xAF\x81\x23\xA0\x12\xDF\x88\x62\x02\x1B\x11\x62\x44\x46\x15\x5B\x9F\x09\xAB\xA1\x75\x73\x87\xF0\x7A\x24\x74\x9C\x9F\xED\x90\x12\xCC\x64\x92\x01\x1B\x59\x3D\xAC\x42\x8D\x70\x00\x14\x35\xA3\x4A\x16\x2B\x7B\x84\x65\x0F\xAA\x50\x09\x17\xA4\xE3\x96\x75\x6C\x3F\xA2\x2A\x72\x33\x09\x16\x45\x0F\x31\x31\xDF\x72\x8F\x00\x00\x5C\xE9\x3F\x6A\x13\x3B\x50\x01\x17\x31\xC2\x6D\x94\x83\x72\x9B\xAC\x22\x30\x62\xA0\x00\x64\xA2\x4F\x54\x80\x00\xB0\x1C\x06\x54\x11\x19\x1A\x61\x11\x61\xAF\xA4\x02\x1D\xA6\x95\x6B\x90\x1C\x25\x06\x74\xAD\x2E\xA2\x36\x88\x1D\xA3\xA6\x66\x03\x99\xA5\x92\x98\x54\x4D\x88\x83\xAC\xA6\x85\xAF\x7D\x6F\xA1\xA7\x73\xA7\x14\x80\xAA\xA8\x3A\x39\xA7\x8D\xAD\x80\xF1\x9A\x31\x7F\x8E\x31\xA4\x92\x88\x02\x1D\xA7\x7F\xA6\xA7\x82\xA5\xA9\x84\xA4\x80\xB6\x89\x9F\xE4\x8D\x27\x79\xAE\x06\x50\x40\x98\x87\xA6\x9D\x3C\x73\x4B\x24\x3F\x32\x95\x68\x9F\x64\x64\x34\xFA\x33\xA6\xAE\x1E\x32\x79\x83\x2C\x5C\xAD\x99\xDF\x92\x13\x14\x91\x10\x56\x4C\x33\xAE\xAE\xA9\x75\x93\x98\x64\x13\xAC\x00\x05\xAC\x36\x32\x4F\xC9\x74\x7E\x47\x50\x26\x4D\x8F\xA6\x3C\x36\x54\x3E\x59\xA9\x32\x16\xAD\x61\x28\xAD\x42\x3F\xAB\xDD\x9A\x82\x51\x7A\x9B\x01\x18\x34\x4A\x3C\x06\xDB\x9B\x66\xE1\xAE\x99\x73\x13\x94\x01\x11\x7E\x52\x34\x35\x21\x4A\x81\x06\x14\xAF\x1C\x8D\xAE\x4F\x35\x37\x53\x36\x2B\xE0\xA1\x10\xDE\x91\x75\xEE\xA0\x00\xF0\xAB\xAF\x21\x4F\xA6\x77\x0C\x12\x0F\x12\x06\xBE\x15\xA0\xEA\x91\x35\x57\x88\x73\x04\x98\xA2\x32\x1B\x9A\x04\x71\x74\x53\xA1\x10\x45\x7D\x8C\xFF\x0B\x9F\x62\x34\x36\x6E\x09\x98\xB4\x7B\xA3\xFB\x75\x9D\x95\x61\x81\x90\x98\x35\x63\x35\x36\x72\x92\x4F\x94\x95\xB2\x10\xA1\x36\x29\xBF\xB1\x2B\xB5\xAB\xA7\xA7\xAB\x6A\x37\xB1\x58\x33\x38\x65\x05\xA4\x8F\x75\x77\x4D\x8F\x92\x83\x6D\x39\x60\x2B\x90\x6D\x0A\xB3\x15\x50\xB4\x82\x38\x3A\xDA\xA4\x12\x48\xB7\x3A\x71\x3D\xAF\x00\x0C\x3B\xA1\x37\x8F\xB3\x42\xB4\xA9\x31\x39\x88\x39\x7C\x66\x0D\x37\x7D\x88\x5E\x2E\x66\xB5\xAA\x32\x39\x39\x62\x3B\x24\x2B\xB4\x5D\x45\xB5\x3A\xB1\xB6\xA0\x38\x06\x50\xB5\x8F\x6D\x0D\x84\x35\x92\x10\x14\x4B\x3B\x2D\x74\x63\x9D\x65\xA1\xA4\x87\xA1\x54\x5F\x7A\x01\x13\xB7\xBC\x3F\x3D\x1C\xA4\xAA\x60\x9F\xA1\x7C\x7B\xB7\xBD\x42\xB7\x39\x64\xB7\x80\xB5\x77\x3C\xB2\x10\x90\x7E\x72\x57\x1E\x7A\x87\xBD\xB7\x89\xBF\xB7\xED\x60\xB9\x6E\x06\xB6\xFB\x2B\xA3\xCF\x38\x76\xF1\x45\x69\x4B\xA5\x82\x4D\x82\x9D\x7D\xB5\x3C\x9E\xB0\xB1\x68\x90\x00\xA8\xA9\x85\xCD\x32\xB7\xA6\xB1\x3D\xD3\x3B\x55\xC3\x14\xBA\x00\x03\xB2\xFE\x40\xAB\x4E\x8A\x85\xAE\xB0\x3D\x4F\x24\x24\xB2\xBF\x72\x11\xB9\x92\x24\x1E\x86\xBB\xB6\x15\xBD\xB1\x25\x65\xAF\x9F\x02\x19\x9C\x1A\xB4\xBC\xA5\xB7\x07\xFC\x6F\x3D\xD6\x2D\xB8\x01\x1F\xB8\x76\xBD\x84\xCE\xB0\x00\xCF\x31\xBD\xBF\xB5\x63\x35\xB6\x64\x24\x14\xBD\xDA\xB8\x3E\x3E\x56\x2B\x01\xB5\x94\x60\x2A\x9C\xFF\x04\xBB\x0B\x6D\x3F\x3E\x56\x3F\x14\x72\x94\xF9\xAB\x58\xE9\xBA\xB1\xE4\xA0\x00\xED\xB2\x3F\xDD\xBE\x06\x4D\xB5\xBB\x8D\x5D\x84\xF7\xB9\xBF\xFE\x3C\xB2\xAF\xAE\xB2\x4C\x11\xC0\xFC\x3A\xBF\xA8\xB6\xA2\x69\x9F\x23\xB9\xA8\xBF\x09\xC3\xC0\x95\x6F\xA6\x6F\x01\xC1\x65\x05\x51\x08\xCC\x60\xFB\xBD\xBF\x19\xBB\x75\x22\x1C\x63\x02\x41\x41\x06\x48\x40\x5A\x3B\x40\x0B\xC7\x63\x02\x12\x06\x6F\x36\xA0\x24\x1F\x8C\x03\x42\x80\x06\x44\x41\x27\xC3\x64\x27\xA2\xBC\x76\x5A\x19\x02\x1B\x41\x13\x2E\x41\xD4\x3C\x74\x9A\xBB\xB1\xA8\x4C\x5D\x00\x6D\xA2\x9F\x61\x8E\x58\x9D\x84\xFB\x92\xC4\x24\x68\xB9\x6F\xA1\x96\xEB\x86\xB2\x19\xA0\x00\x4A\xC3\x63\xF1\x5D\xBF\x2E\x3E\x10\x85\xB7\x4A\x12\x83\xC5\x25\xA8\xC2\x0D\xCF\xB2\x39\xC2\x61\x43\xC5\x77\xFD\xB4\x15\x58\xCC\x8E\x5A\xC7\xB2\x5C\xC0\x89\x0C\xCA\xBA\x36\xB7\xA0\x6A\xC2\xC6\x4B\xC6\xB7\xF7\xBF\xAF\xC9\x1A\x61\x2E\x3A\x17\x8D\x5F\x61\xEA\x52\x10\x31\x43\x43\xE0\x36\x43\x38\x4D\xA9\xA2\x89\xAC\x89\xAF\x8F\xEE\x80\x00\x3D\x4E\x32\xE9\xA8\x82\x29\xCD\x32\x6A\x19\xAA\x22\x3E\xC7\x78", "\xCB\xBF\xCC\xA6\x45\xE4\x17\x06\x6A\x12\x04\xD2\x39\x17\x6C\x12\xC9\x5F\x44\xC9\x3E\x46\x2D\xF4\xA3\x10\xF4\xAC\x6A\xA0\xC6\x4E\xA2\xCC\xC8\x6E\xAF\x87\xAC\x6C\xC9\xEC\x2B\x40\x0E\x58\x6C\x19\x44\xC9\x45\x47\x44\xDA\x66\xBE\xF3\xB5\xBB\xF5\xBE\xC1\x40\xC2\x81\x59\x41\x45\xD2\xB2\x4F\x3F\xC7\xC9\x7E\xCD\x41\x5A\x4F\x3D\xB6\x2F\xC3\xF8\x81\x46\x63\x45\x46\x84\xC0\x8E\x86\xCC\x55\x4C\x11\xB7\x69\x4B\x46\x6D\x42\x53\x7B\xA5\x9A\x07\x68\x9A\xF7\x22\xB9\x27\x50\x48\xD8\xC1\x53\xCD\x42\x4F\xE7\xBB\x8C\xBD\xC1\x7F\xFF\x06\xCD\xA9\x43\xCE\x9A\x94\xCC\xA7\xAD\x46\x0E\xC9\x10\x75\x47\x47\x12\x4A\x47\xB9\xC2\xBF\x09\x18\xBE\xC2\x82\x9F\x9D\x79\x46\x95\x1B\xA0\xC6\x4D\xA0\x4C\xA4\x07\x4D\x8B\x9A\x81\x4C\xC6\x5E\xC7\x8B\x12\xB6\x76\x49\x99\xD0\xBE\x8A\xBC\xC0\x80\x81\x64\x1B\x90\x8E\x49\x48\x0E\x8D\x94\x33\x8D\xA4\x32\x16\xD1\x95\x18\x48\x2F\x1F\xC3\xEC\xCE\x48\x90\x42\x49\xC7\x92\xD1\x4E\x95\xD0\x70\xB6\x56\x24\xD1\x49\xEC\x75\xB6\xC1\xB1\x75\x23\xDF\xD1\x8F\x4E\xD2\xA6\xA9\xBA\xAB\xBC\x14\x20\xC1\x4A\x30\x13\x4A\x9C\x44\xA1\xC8\xAC\x90\x79\xBD\x84\x3B\xD0\xD0\xA2\x45\x27\x3F\xD1\x79\x4D\xC4\xB8\x68\xCB\x63\x2E\x65\x21\x3E\xD4\x3D\x46\x85\x55\x75\x92\x69\x1C\x6E\xB3\x7C\xCD\x63\x3C\xD5\x06\x51\xD7\xB9\x76\xBD\xBF\x6A\x18\xD1\x44\xDF\xD4\x99\x48\xD4\x52\xDA\xD0\x34\xCF\xC5\x3A\xD4\xD6\x47\xDB\x49\x67\xD1\x79\x65\xC5\x19\x48\xC8\x4A\xAA\x41\x4E\x68\x06\x9F\xCC\xC3\x4B\x75\xD7\x4B\xB9\x41\xBA\x5D\xBB\x8D\x89\xCB\xD7\xE9\x49\x4B\x79\xD0\x90\x82\xD2\x4E\x5A\x68\xA3\xFD\xC5\xCD\x2C\xDF\x4B\xB7\x4E\x2D\xE2\xB8\x5A\x91\xA5\xA7\x68\x0A\xB7\x65\x54\xD5\xB4\x4D\x1F\xE8\x43\x9A\x98\xAF\xBD\x9F\x97\x35\xD9\x4A\xCD\x9C\x60\xB5\xFF\xA3\xCF\x2A\x3B\x4C\x1D\x24\xC4\xB9\x66\xC4\xE9\x98\xAB\xF4\xC8\xDA\x5C\x11\xB8\xE2\x5E\xA1\xAE\x82\x96\xAE\xD7\xDA\x00\xDA\x4D\x2B\x47\xCE\x01\x1B\x18\xEB\x80\xC0\x0F\xC9\x4D\xA9\xD8\xD6\x62\x65\xC3\x51\x72\xBE\xC2\xDC\x15\x04\x76\x95\x16\xAD\x84\xC8\xD2\x4D\x04\x7F\xC3\xCF\xDA\x4D\xD1\xDE\xD9\xDE\x41\xD4\x9B\xD8\x4B\x5A\x6D\xB2\xCA\xAC\x14\x16\xD6\xD7\x7D\xD8\x9C\x14\xD0\xD8\xAA\xA9\x46\x76\xD0\xD9\x6B\xA2\xD9\x7E\xA2\xA9\x11\x16\xD9\x67\xB6\xD8\xE7\xDF\x7D\xC6\xC5\xBD\x1D\x45\x20\xAB\x11\xAA\x81\xA4\xDE\x93\xC6\xDE\x8F\xD8\x7F\x0F\xC6\xBB\x64\x0B\x4E\xF8\x89\xDD\x86\xA1\xD4\x88\xA4\xCD\x32\x19\xBD\x03\x55\x50\x6C\x0C\x4F\x69\x07\xBB\x34\xB9\xBA\x05\x93\xB1\x57\x3B\xE0\x4F\x5E\xE0\x7D\x9D\x13\xD2\xDB\xA6\x0D\x5F\x50\xDF\x7E\x93\x78\x78\x14\x9C\xD9\xA3\x6A\xA8\xA7\x14\x5E\x50\xDE\x2B\x9A\x3C\xCF\x65\x1E\xE4\x87\x25\xE5\x31\x0C\x58\xE2\xC2\x91\xD3\x77\xA0\xE3\x27\xED\xE2\xF0\x74\xBB\x1A\x10\x31\x87\x99\x54\x7F\x51\x97\xE4\xCF\x46\xDB\xC6\xE0\xB8\xBF\x8C\x40\xEF\xCE\x95\x6B\x98\x59\x1D\x98\xC3\x81\x8B\x14\x5E\x97\xB8\x22\xDA\x54\x46\xAB\xE0\xB3\x12\x6B\x92\x10\x20\x51\x42\x22\x56\x2D\xC7\xA5\xC8\xB5\xB8\xBB\xEC\xC9\x52\x2B\x50\xCF\x38\xDF\xC6\x2D\xCF\xE3\x2F\x59\xCD\xE5\xC3\xE4\x5E\xE7\xE0\x69\x3C\x89\x67\x2E\x52\x3D\x10\x53\x48\xE0\x7C\xF1\xCA\x5F\xB9\x81\xE7\x4F\xE3\xE7\x6A\xE2\xE4\x76\xE5\xE6\x55\xE1\xAB\x00\x96\x53\x76\x65\x69\x7A\x66\x10\x87\xEC\x67\x88\xC5\xDE\x00\x04\xE8\x81\x65\x69\xBC\xD0\x00\xFF\x52\x69\x50\xC2\xA2\x67\x5F\x33\x3E\x5A\xDA\x83\x82\x8E\xEE\xD2\x7F\x27\xBE\xAD\x60\x22\xDB\xF4\x54\xDB\xE5\x56\xDB\x29\xA1\xA1\x5F\x58\xE9\x42\x3A\xE9\xD3\x9D\xDD\x70\xC1\xC5\xA0\xEE\xD5\xF1\x5F\xC3\xFB\x91\xEB\x5D\xC9\xD6\x6E\xC1\xE8\xFF\x07\xBF\xB1\xE8\x6A\x40\xA0\x00\xD2\xAE\x53\x4D\xEA\x8B\x68\x59\x55\x52\x50\xD4\x5E\xE8\x9E\x85\x85\x26\x7F\x55\xEC\x50\x57\xEC\x4A\xD9\x8E\xB5\xDF\xC4\x79\xEF\x40\x5F\x50\x57\x69\x50\xED\x98\xBC\xCE\x00\xE5\x72\xD5\xE0\x4A\xD7\xE8\x55\xCF\xE2\xEB\x83\x22\xD2\x66\x5E\xEC\x5A\x53\x97\x09\x17\x7B\xD4\x90\xE1\xAE\xE7\xE6\x4E\xE7\x56\xD8\xE2\x56\xE4\xEE\x6D\x78\xBC\xE9\xA6\x8D\xEC\xF3\xE2\x57\xF5\xEF\x6F\xD2\xE5\xEA\xD4\xEC\xEC\xF1\xE8\xEE\x63\x55\x77\xDC\xEC\x9B\x24\x78\xD5\xDF\xE8\x51\x6F\x52\xEE\x6A\x5D\xEF\xDE\xB2\xE1\x0D\xD3\x12\xEC\xC4\xF0\xFB\xB4\xBB\x00\xE9\x53\xA8\x46\xF1\xDE\x27\xBF\x00\xEB\x4E\x20\xE0\x00\x78\x5E\x1B\x2F\xDC\x18\xC9\x77\xA6\x49\x31\x44\x38\xC1\x10\x23\xF0\x26\x27\xDC\xA0\x13\xDE\xE2\x4C\x15\x07\x27\x1F\x08\x87\xE2\x10\x34\xF7\x12\x3A\xF7\x12\x73\x13\x17\x3B\xFC", "\xF3\x3D\xFC\x14\x3F\xF9\x10\x41\xF2\xF4\x43\xF3\x10\x45\xF2\x13\xA5\xC2\x10\xF4\xA5\x04\x58\x00\x05\x37\xF2\x10\x87\xEF\x02\x5E\x0A\xF3\x73\x1B\xF4\x01\x14\xAF\x41\x04\x04\x44\x01\xF5\x01\x13\xF5\x2B\x01\x00\x40\xFC\x14\x58\xF0\x00\xF4\xA3\x05\x55\x02\x04\x62\xF9\x10\x6B\xF0\x00\x2D\x0E\xF5\x00\x07\xF5\x19\x85\x37\x55\x0C\x04\x70\xF3\xF5\x2A\x05\xF6\x72\xF9\x10\xF4\xA4\x04\x49\x06\x05\x77\xF2\x10\x2F\x0F\x02\x30\x7B\xF7\xF5\xA5\x37\x4F\x04\x04\x6D\xF3\x10\x6D\xF5\x02\x5C\xA3\x17\xAA\x7A\x04\x4F\x09\x04\x4E\x0B\xF8\x02\x1D\xF6\x26\x0F\x92\x35\xE5\x3E\x79\xAE\x04\x54\x05\x04\x52\x03\x05\x45\x03\x04\x54\x09\x04\x4F\x0E\x04\x81\xF1\x10\x2F\x0C\x07\x01\xB3\x17\xA9\xF0\x00\x4C\x05\x04\xAA\x7F\x02\x3C\x0F\x02\x3D\x00\x6F\xAE\xF9\x67\x02\x17\x04\xB2\xF6\x8B\x2F\x0E\x03\xB6\xF0\x65\xB9\xF9\x10\x87\xEC\x04\x54\x0F\xFA\xB4\xF8\x6B\xC3\xF8\xE8\xBB\xF7\xFC\xBA\xFA\xFA\x3E\x00\x70\xCB\xF3\x10\x87\xE5\x04\x51\x03\xFB\x3D\x06\xFB\x45\xA3\xFD\x52\xF2\xB7\xBD\xF9\xBA\x2F\x01\x02\xB6\xFC\xAC\x73\x1D\xBF\x41\x03\x05\x53\x09\x04\x47\x08\xFA\xCF\xF0\x00\xB6\xF3\x6A\x94\xA3\xDB\xDA\x21\x04\x49\x01\xFB\x44\x0F\x05\x54\x08\x04\x45\x0E\x04\xB3\xFF\x03\x2F\x0F\x03\xE5\x26\x4A\x57\x22\x81\x01\x05\x55\x01\x11\x13\x02\xA5\x7F\xF4\x5F\x03\x26\x01\x04\x52\x03\x12\x08\x7E\x3F\x01\xCE\x29\x65\x73\x23\x04\x4F\x00\x14\x05\x02\x5F\x04\x08\x05\x02\x26\x09\x04\x4D\x01\x12\x1F\x7C\x52\x07\xF5\x7A\x00\x1D\x03\x54\x73\x08\xD4\x55\x80\x4C\x07\xF4\x56\x7D\x80\x0D\xF6\x3A\x01\xED\x3A\x2D\x28\x6A\xF4\x5E\x80\x14\x8A\x02\xA7\x09\xDB\x7B\x01\x4C\x26\x04\x8A\x47\xD2\x0F\x04\x4D\x00\x03\x8B\x81\x00\x05\xED\x6C\x01\x8F\x36\xF8\x26\x67\x95\x0F\x02\x54\x00\x08\xAD\x7A\x17\x07\x51\x57\x6E\x97\x76\x80\xFB\x7F\x0B\x0D\x80\x29\x01\x04\x59\x00\xF2\x7B\x02\x64\x41\xFE\x63\x75\xD2\x09\x02\xA2\x7E\x14\x92\x02\x54\x86\x0A\xAD\x7F\x17\x0D\x05\x3C\x32\x13\x92\x66\xF8\x5F\x02\x8E\x03\x2F\x02\x04\x54\x83\x10\x05\x02\xC8\x7B\x0F\x18\x01\xB1\x7B\xAD\x7F\x43\x10\x1D\x82\x18\x85\x0D\x81\x03\x37\x88\xFC\x7D\x01\x06\x14\x83\xE1\x5B\x4D\x50\x83\x35\x8A\x07\xC3\x03\x12\x05\x02\xCE\x7C\xF8\x42\x7C\x14\x07\xE5\x01\x0A\x00\x85\x30\x02\x10\x0F\xAC\x82\x37\x87\x08\x89\x84\xF3\x6A\x7D\x29\x06\x74\x06\x08\xEE\x7F\xF5\x01\x2D\x12\x96\x81\x02\x08\x08\x1C\x00\x40\x88\x74\x28\x68\x15\x19\x02\x17\x87\x0B\x16\x03\xC9\x74\x04\x2A\x3C\x24\x32\x10\x1D\x04\x14\xA2\x09\x37\x57\x0A\xA9\x87\x13\x02\x02\x4A\x03\xF4\x54\x03\xFE\x55\xC1\x6A\x03\xAC\x07\x38\x71\x79\xD6\x2D\x27\x5A\x88\x01\x94\x7C\x08\x86\x02\x7B\x85\x08\x09\x3F\x8B\x4C\x6E\x1F\x02\x2C\x9F\x07\x2B\x4C\x18\x9F\x02\x63\x85\xF6\x74\x54\x12\x20\x01\xCF\x81\xF9\x12\x87\x2A\x06\x0C\xAA\x3D\x1D\x08\x22\x21\x07\x19\x8B\x48\x69\x86\x04\x29\x81\x10\x14\x02\x50\x5E\x0C\x19\x4C\x11\x0F\x0C\xB4\x84\x2A\x98\x80\x44\x07\x09\x29\x7B\xD8\x7D\xBF\x64\x02\xF4\x02\x1A\x23\x05\x1D\xBF\x42\x69\x88\x00\xD2\x00\xE5\x67\x02\x71\x6C\x99\x27\x02\x12\x09\x0D\xCD\x4A\x34\x83\x02\x48\x05\x01\xAA\x3D\x88\x06\x14\x25\x01\x41\x86\x85\xEF\x84\x0D\x8F\x03\x27\x0C\x04\x2A\x3E\x0A\x67\x4D\x26\x07\x19\xB3\x6E\x00\x07\x08\xD9\x03\x15\x0F\x02\x52\x07\xFE\x55\x80\x27\x08\x00\xD0\x5B\xE0\x38\x0A\x27\x02\x1F\x9F\x4B\x8E\x8F\x11\xA1\x8B\x17\x13\x02\x48\x04\x09\x15\x87\xE5\x58\x06\x6C\x00\x0A\x0A\x89\x8B\x54\x25\xA0\x89\xFB\x70\x13\xD2\x03\x4C\x80\x46\x68\x02\x0E\x29\x00\x9C\x82\xB8\x3A\x8A\x4B\x98\x02\x20\x8F\x27\x80\x00\x3C\x0E\x15\x2A\x00\x51\x92\x7F\x1C\x8D\x08\x1E\x89\x9D\x82\x05\xCE\x00\x11\x0A\x8A\x92\x33\x05\x22\x87\xD2\x46\x14\xF7\x7C\x48\x8F\x7D\x5E\x0C\x05\x0F\x8B\x2D\x81\x15\xD3\x8A\x4B\x8E\x02\x48\x82\x29\x81\x50\x3A\x0D\x02\x4F\x86\xF8\x5D\x8A\x5F\x06\x09\x35\x7B\x8A\x84\x90\x68\x1E\x0B\x0E\x8B\x6B\x50\x2E\xB9\x7F\x24\x03\x05\x78\x4C\x3C\x2F\x01\x78\x8E\xC4\x65\x8B\x96\x87\xFF\x54\x02\x14\x06\x80\xF8\x4A\x2B\x25\x02\x18\x0A\x11\xB3\x19\x40\x10\x8B\xC8\x84\x09\x22\x7D\x74\x81\x16\x54\x09\x0C\x03\x8B\x01\x3A\x20\x30\x8B\xD8\x74\x05\x4A\x8A\x25\x52\x01\x5B\x89\xA8\x70\x8A\xCA\x7F\xFA\x6A\x0B\x0C\x0D\x8C\x57\x52\x33\x92\x8A\xC2\x8F\x05\x54\x82\x13\x1C\x7D\x50\x5A\x52\x6E\x18\x1A\x08\x19\x9B\x18\x5C\x8E\x02\x45\x07\x0A\x2A\x8B\xE2\x15\x03\x21\x8E\x97\x70\x8B\x4F\x06\x08\x20\x8A\x33\x06", "\x03\x3E\x8C\x1A\x90\x8B\xE7\x7F\xF5\x53\x0B\x1B\x06\x1C\xAE\x53\x63\x8B\x8D\x54\x8C\x2F\xA5\x8D\x39\x08\x03\x01\x8E\x8D\x63\x8C\x54\x8B\x08\x27\x7E\x2A\x0B\x10\xB8\x15\x0E\x16\x8E\x9C\x7F\x39\xA6\x8B\xFB\x76\x04\x55\x02\x13\x03\x02\xAA\x3A\x48\x63\x02\x1D\x0F\x0C\xA1\x7A\x5E\x8F\x87\xC1\x8D\x7F\x79\x4F\x37\x06\x06\x3B\x00\x78\x97\x26\xAA\x8B\x3C\xB8\x7F\x77\x84\xE5\x65\x00\x0F\x17\x8F\x8E\x39\x3F\xAC\x8C\x21\x04\xF9\x2D\x86\x2D\x4A\x58\x79\x0D\x07\x0F\x86\x7C\x40\x1C\xC2\x02\xE8\x72\x02\x56\x05\x08\x11\x75\x0A\x6A\xC1\x3E\x01\x73\x85\x62\xE2\x8C\x35\xA7\x7C\xB0\x8E\x06\x3F\x01\x7B\x8D\x27\xC8\x8C\x0A\x14\x03\x3D\x88\x04\x7D\x5F\x74\x35\x13\x40\x07\x43\xAB\x78\xEC\x8E\x12\x9A\x83\x88\x88\x88\xF5\x84\x4E\x2E\x24\x00\x96\xA4\x02\x90\x55\x87\x02\x48\x87\x09\x2A\x3C\xD5\x2D\x15\x42\x01\x6D\x96\x91\x2E\x8E\x0A\x0D\x80\xA5\x84\x7E\x43\x00\x6A\x83\x80\x19\x94\x2A\xAD\x83\x22\x01\x04\x4B\x00\xD4\x42\x03\x92\x0B\x0D\x04\x03\x67\x8B\x9A\x70\x8B\x48\x85\x7D\x72\x8D\x08\x2B\x49\xC1\x34\x24\x46\x11\x11\x0A\x91\x8A\x31\x49\xAE\x88\x29\x08\x08\xD5\x02\x14\x0E\x02\xFD\x58\x46\x4F\x66\x23\x00\x26\xC9\x36\x98\x97\x7F\x1A\x84\x33\x85\x03\x18\x96\x89\x65\x03\x11\x07\x92\x90\x87\x4D\xAD\x8C\xFA\x73\x19\xBB\x80\x00\x07\x0A\x80\x60\x09\x17\x91\xD5\x6A\x27\xC9\x02\x70\x8D\x7F\xFC\x21\x09\x34\x90\x8A\x10\x17\x9B\x82\xE8\x6A\x3D\xAF\x34\x2A\x0A\x03\x36\x95\xCB\x7A\x93\x14\x17\x02\x1F\x80\x46\xB8\x59\x39\x06\xD7\x4B\x03\xA2\x80\x92\x22\x8F\xFC\x5F\x7F\x36\x6A\xDE\x4C\x03\x82\x93\x25\x70\x8A\x03\x88\x87\xBA\x74\x05\x11\x77\x0E\x76\x6F\xDB\x20\x4F\x95\x48\x50\x9F\x05\x57\x00\x12\x15\x7F\x45\x00\x6A\x77\x03\xBC\x2E\x04\x3F\x92\x9E\x86\x02\x49\x8B\xEE\x41\x52\xAF\x0F\x04\x54\x93\xD5\x10\x8B\x64\x91\x42\xA1\x7D\x22\x04\x04\x2B\x4B\x46\x14\x08\x18\x4C\x0C\x10\x02\x5F\x9C\x22\x85\x8E\x14\x19\x02\x4A\x89\x2B\x39\x03\x28\x02\x2B\xC4\x54\xAD\x9A\x8E\x54\x00\x21\xA6\x88\x11\x78\x06\x52\x03\xA9\x80\x48\x90\x8C\xF2\x41\x02\x26\x0C\x04\x59\x01\xA4\x6B\x71\x62\x0F\xA1\x1D\x97\x66\x5F\x2D\xCC\x03\xF9\x73\x02\x26\x88\x3C\x14\x03\x4F\x9A\x27\xFB\x7D\x15\x0D\x02\x90\x90\x50\x15\x02\x63\x99\x94\x10\x8E\xBD\x9C\x7D\x72\x8D\x09\x2B\x48\x75\x87\x39\x15\x0B\x88\x16\x02\x94\x90\xD3\x34\x95\x7E\x85\x05\x24\x7D\x40\x9D\x10\x57\x04\x5F\x95\x97\x2F\x00\x05\x52\x02\x05\x8A\x3D\x3B\x70\x0E\x18\x03\x79\x96\x45\x0D\x95\x84\x9E\x7C\x50\x5C\x19\x56\x09\x2C\x01\x31\xA4\x37\xC4\x83\x91\xA5\x7B\x08\x31\x6A\xDB\x03\x06\x5A\x00\xC1\x92\x4A\xC0\x8A\x59\xBE\x86\x0D\x8B\x92\x00\x42\x4F\x0C\x09\x13\x13\x0B\x24\x98\x5A\x95\x05\x69\x7F\x6B\x90\x5A\x06\x16\x70\x1C\x03\x67\x87\xBF\x37\x8D\x10\x0D\x02\x07\x80\x0A\x09\x87\xE4\x30\x75\x0A\x5D\x19\x1D\x02\x2D\x98\x30\x30\x8B\x26\x09\xF8\x75\x7B\x9C\x98\x59\x45\x58\x75\x15\x7A\xA2\x7F\xE2\x61\x8F\xC6\x86\x8F\x1F\x86\x1B\xAE\x03\xA4\x1F\x05\x43\x99\x1A\x30\x99\x18\x84\x01\x88\x88\xCA\x75\x04\x78\x47\x0B\x04\x01\xC1\x47\x0B\x26\x16\xB7\x65\x06\x60\x00\xB5\x88\x80\xE7\x85\x18\x8E\x02\x28\x05\x05\x54\x03\x46\x97\x9B\x79\x99\xAC\x6F\x09\x30\x0A\x31\x80\x9F\xE7\x6F\x89\x98\x91\x5C\x88\x03\x95\x48\x38\xF6\x6A\x18\x03\x94\x86\x20\x6E\x9F\x02\x1C\x94\x05\x4F\x02\xF8\x57\x9B\x3C\x97\x0D\x1F\x03\x60\x43\x06\x18\x9C\x20\x3A\x9C\x84\x98\x26\x9F\x9C\x12\x09\x48\x73\x00\x1A\x03\x9D\x95\x0C\x0C\x26\x9D\xB7\x91\x38\x99\x83\xE8\x6C\x02\x91\x70\x71\x95\x0D\x32\x0F\x0C\xFB\x4D\x05\x9E\x98\x85\x9C\x6E\x9F\x03\xDF\x92\x0F\xD8\x91\x11\x0F\x53\x77\x9F\xC0\x07\x5E\xEA\x16\x06\x67\x95\x22\x64\x9E\xC1\x98\x37\x9C\x99\x20\x05\x34\x92\x93\x2E\x77\x9B\xBC\x1B\xFD\x27\x03\xDE\x9F\x7C\x20\x89\xF1\x82\x9E\xC6\x80\xF4\x48\x87\x37\x88\x3C\xA4\x00\x33\x91\x0D\x68\x07\x19\xB4\x5C\xE8\x96\x3C\xDF\x00\x14\x94\x82\x9D\x9A\x0A\x0B\x49\xBB\x9B\x05\x41\x01\x0B\x1A\x02\x5D\x07\x05\x37\x02\x15\x09\x06\x59\x9A\x80\x1E\x9E\xD1\x98\x03\xA9\x7F\xF5\x78\xFC\x24\x02\x1A\x0F\x86\xAA\x3E\x09\x0F\x9B\x22\x02\xBE\x5B\x01\x18\x0D\x01\x7A\x06\x7E\x9A\x03\x2F\x09\x3F\xFB\x9F\x1A\x1A\x98\x3B\x88\xF4\x4C\x97\xB8\x8B\x40\x94\x9C\x09\x1B\x02\x30\x05\x05\x39\x01\x2E\x0A\x02\x6C\x03\x33\x90\x5A\xE5\x87\x09\x27\x87\xDC\x94\x06\x2B\x02\x0B\x0F\x01\x2D\xA5\x0D\x0F\x87\x48\x71\x3E\xBC\x7E\x4F\x82\x96\xEE\x7D\x85\x85", "\x08\xB2\x97\xB3\x09\x0B\xA0\x3D\x87\xFF\x81\x1C\x89\x08\x21\xA0\x00\x27\x00\x0A\x1B\x02\x5E\x07\x04\x1C\x02\x2E\x0D\x05\x7C\x03\x12\xBC\x02\x2E\x01\x05\x2A\x01\x13\x0C\x07\x22\x03\x11\xBE\x02\x22\x03\x89\x8D\xA3\x27\xA1\x45\xAA\x02\x08\x0F\x03\x1A\x98\x58\x92\x02\x06\x84\x05\x40\xA3\x6B\x8E\x88\x09\x08\x8D\xAE\x7E\x12\x08\x02\x46\xA0\x12\xAA\xA2\x4C\xA6\x89\x8B\xA3\x2E\xA4\x45\xD6\xA0\x12\xB9\xA2\x71\xA4\x8B\x92\xA2\x11\x09\x02\x70\x03\x33\x90\x7B\x50\x5B\x0A\x12\x9B\x37\x8A\x14\xAF\x03\x1C\x0B\x01\x71\x03\x86\xBB\x65\x0A\x8E\x03\xFB\x7C\x15\x1F\x83\x09\x08\x92\xAE\x7F\xC1\x7A\x02\x57\xA2\x0A\x0D\xA2\x2F\x02\x05\x2B\x00\x24\xA3\xF8\x5D\x02\x14\xB9\xA4\x2B\x03\xF0\x72\x03\x67\x86\xF3\x1C\x4E\x9F\x98\x7F\x21\x20\x1F\x68\xA5\x9E\x0E\x02\x52\x03\x1B\x10\x18\xFC\x0F\x27\x0B\x48\x20\x00\x02\x24\x00\x0F\x0B\xA5\x65\x06\x07\x10\x5A\x5C\xAF\xA6\x38\xA6\x0B\x11\xA5\x19\x68\xA5\x74\xA5\x5B\xA6\x2B\x3A\xA7\x29\xBA\x65\xFB\x62\x20\x3E\xA5\x18\x0F\x02\x72\x45\x33\xA1\x08\xC4\xA1\x84\x3E\x00\x1D\x00\x02\x22\x03\x2B\x84\x03\x22\x00\x04\x13\x0A\x10\x0A\xC3\x1D\x23\x07\x36\x15\xB4\xA0\x98\x28\x02\x10\x0B\x07\x20\x00\xD4\x20\x01\x3D\x05\x9A\x96\x03\x23\x28\x4D\xA0\x01\x1F\x0D\x00\x0A\x01\x9A\xBD\x09\x69\xA5\x4D\xBD\x87\xAC\x19\xA6\xDB\xA5\x9B\xBC\x61\x0C\x75\x06\x61\xA5\xD2\x03\xA7\xE5\xA7\x9C\xA9\xA6\x11\x0F\x3E\x3E\x84\x57\x19\xA6\xEF\xA1\x9E\xB8\xA4\x7A\xA2\x02\x67\x9F\xF7\x18\xA7\x73\x04\x9B\x92\x20\x6F\xAD\xC3\x60\xA4\x08\x02\xA7\xE4\xA6\x9C\xB9\x30\x74\xA5\x4D\xDC\x5C\x42\xB0\xA7\xF2\xA1\x97\x94\xA7\x86\xA6\x11\x10\xAA\x44\xBC\x20\xFB\xA4\xE9\x3E\xA7\xD0\x19\x51\x82\xA9\x47\xA5\xA9\xEE\xA0\xA4\x8B\xA9\x91\xAF\x0D\xB0\xA9\x3E\xB3\xA8\x29\xAE\xA2\x98\xA9\x80\xAB\x51\x83\xA8\x37\x90\xA9\x09\xA9\xA4\x8C\xA8\x75\x8F\x06\x48\x0A\x49\xBA\xA7\xDF\xA1\x84\x2B\xA8\x80\xAA\x51\x8B\x0C\x47\xA2\x01\xD1\x15\xA8\xB4\x03\x8F\xAA\x50\xC5\xA7\x48\xB6\x87\x75\x02\x68\x07\xAA\x9C\xA9\x54\xBD\x0B\x52\xAD\xA9\x3D\xAD\x9A\x84\x03\x7B\x80\x26\x54\xAA\x50\xA3\xA9\x2C\x16\x70\x1B\xAA\x94\xAD\x55\xFD\xA7\x45\xBF\xA7\x60\xAE\xA9\x83\xA9\xD0\x64\x2D\x66\xAB\x4C\xB5\xA6\x0C\x8A\x0E\x2B\xAB\x1D\x6D\x56\xDF\xA8\x4F\xB2\xAB\xD5\xA7\x8E\x7A\xAB\x98\xA5\x55\xD2\xA7\x48\xB7\x88\x6C\x03\xAF\x94\xA8\x7E\xAE\x57\xCD\xA9\x19\x0F\xAA\x9C\x67\x34\x76\xAA\xAB\xA0\x02\x0A\xA0\xD4\x80\x01\xD4\xA7\x9C\x9B\xA7\x60\x65\x11\x4A\x66\x52\xB2\xA9\x94\xAA\x04\x2A\x8F\x6C\xA6\x45\xD9\xA7\x16\x00\x01\xB8\xA0\xB3\x9A\xA6\x07\x56\xD0\x19\xAA\x08\x0C\x01\xD9\xA1\xB5\x94\xA7\x8D\x6D\x5A\xFD\x00\x08\x1D\x02\xD5\xA1\x05\x24\xAC\x1D\x01\x5B\xB6\x16\x6A\xBC\x0B\xD8\x32\x9B\x91\xA8\x24\x50\x12\x60\xA4\x68\xA6\xAC\xA8\xAE\xB7\x94\xA6\xA3\x4C\x18\x55\xA6\x17\xA2\xAE\x20\x01\x86\x37\x65\x8B\x46\x5C\x85\xAF\x3C\xB4\xA6\xB2\xA8\x04\x0C\xAE\x8B\x05\x4D\xD8\xA0\x74\xB6\x23\x78\x22\x5A\xB8\x65\x24\x2F\x59\xD6\xAE\x48\xA9\xAE\x21\x22\xB5\x9B\xAE\x3A\x05\x4D\xBF\x02\x49\xA7\x1F\x62\x0D\x7C\x65\xAF\xB3\xA8\x5E\xBD\x0A\x7A\xA9\x67\xD5\xA3\x0F\x24\xAD\x3E\x06\x52\x9F\x17\x51\x0A\x1F\xF3\xAF\xAE\x99\xAF\x7F\x55\x4D\xDB\x02\x69\xB5\xAF\x8F\xAC\x9A\x9C\x41\xDB\xA5\x4D\xDD\x02\x49\xB1\x57\x3A\xA8\xAE\xA5\xA7\x83\x59\x34\x41\x1B\xC2\x40\x0A\x4F\xAF\x0A\x08\x58\x9F\x23\x59\xC8\xAF\x17\xB6\x60\xBD\xA9\xBD\x8B\xAE\xFC\xA2\x02\x06\xB1\x83\xA6\xA9\x02\x67\x7D\x73\x21\xF8\x5E\x55\xC7\xAF\x75\xB8\xAB\x1B\x11\xC4\xB6\xAE\x6A\xA4\x60\xA5\xB3\x81\xB9\xAE\x0B\xB0\xB7\xA2\x00\x07\xB0\x5D\x90\xB2\x52\xAF\xAB\x2C\xAB\xC2\x9B\xB0\x85\x5D\xE0\x18\xB3\x40\xA8\x0D\x61\x06\x1E\xAE\x02\x36\x09\x07\x1D\xB3\x8B\xB9\xAE\x1D\x64\xBD\xA2\x01\x11\x89\x4D\x96\xAD\x11\x0A\xAD\x9A\xA9\xA2\xBF\x38\x95\xAE\x62\xE7\xAF\x94\xBC\xAD\x95\xAB\x81\x98\xB3\x8D\xAB\x4D\x96\x72\x41\x2F\x70\x2A\xAB\x97\x88\xA6\xF1\x3A\x4C\xB6\x16\x0B\x12\x01\x17\xA1\x21\x31\xB2\x00\x04\x5F\xA2\xAE\xBD\x02\x01\xB4\xA5\xB4\xA0\x01\xD3\xA9\x5D\xB4\xAD\x44\xA5\xA7\xAF\xAA\xC6\x89\xB1\xD5\xAA\xD2\x6E\xA4\x83\xBC\xA3\xBB\xAA\xD0\xBF\xAC\x95\x30\x5D\xC4\xAE\x1B\x1C\x57\xC7\xA2\x9F\x6C\xB3\x80\x0E\x4B\xB8\x01\x10\x07\x09\x97\xB0\x9A\xB7\xAB\x0F\xBA\xC1\x78\xB0\x82\xB7\xAF\x13\x3D\xC0\xA4\xAC\x1E\xBB\x4D\xA9\xB2\xD0\x10\x5F\x90\xB6\x94\x94\xB5\x35\xB5\x8D\x6D\xB1\x08\x2E\x01\x39", "\x02\x76\x89\x08\x59\xB4\x67\x9B\xB7\x49\x93\xAA\xB4\xA3\xC0\xA2\x56\x51\xBB\x67\x9F\xB6\x82\xA5\x03\x79\x07\xD0\xA4\xB5\x88\xAE\x63\xF6\xAF\x4E\xB7\xA8\x43\xB7\xC2\x81\xB7\x23\xB5\x06\x49\xB0\x48\x0C\xB2\x08\xAA\xCD\xA1\x21\x95\x4B\x4C\xB1\x03\x5D\x89\x08\xD7\xB5\xD6\xA1\xAC\x2A\xB4\x4B\xD6\xB3\x98\xAE\xAA\x65\xB0\x9F\x17\x71\x83\x29\x6A\xDC\x4F\xAA\xB3\xB6\xBF\x73\x99\xB2\x01\x39\x89\x10\x6C\xB6\xB6\xBE\xB0\x28\x06\xD3\xA1\x01\xD4\xA8\x68\xD2\xB5\x4F\x11\x74\xBE\xA3\x06\x00\x8D\x84\x0B\x6F\xEF\xB7\x93\xAA\xAE\xDA\xA9\x9D\x79\xB3\xE7\xAB\x59\xC4\x20\x3E\x64\xAF\x3D\x0E\xDE\xA5\x02\x7C\xBE\x66\xB4\x00\x68\x89\x08\x0F\xBE\xDF\xA7\xAF\xEC\xAB\x5E\xF9\xB2\x77\xBB\xA6\xE0\xAF\x9E\x63\xAE\x3E\x21\x42\x0A\xB8\xC3\xAF\xB5\x35\x05\x2D\x89\x08\x91\xB2\x71\xF4\xA4\xC5\xA2\xB8\xED\xAF\xBD\xA4\x5E\x00\xB9\x70\x91\xB7\xBD\xBB\x65\xBE\xA6\x06\x27\x8D\x84\x03\x73\xA5\xB8\x76\xA0\xB8\x15\xB9\xBF\xBB\xAF\xFE\xA0\x28\x40\x4B\x05\x7D\xB8\x2E\xBB\xE1\xB0\xB8\x37\xB7\x03\x4B\x99\x42\x06\xBA\x36\xBE\xD7\xA0\x01\x7F\x59\x67\xA6\xB0\x9F\xA0\xB8\x39\xB7\xC4\xBD\xB0\x82\x56\x6C\x92\xB0\xB2\xB5\xB0\x44\xB5\x40\x59\xB1\x21\xB5\x56\xEE\xA6\xC2\xB4\xB6\x6E\xB1\x06\x30\x01\xE2\x89\x10\x64\xB9\xD2\xB0\xB2\x5A\x3C\x0E\x39\xB2\x2A\xB1\x66\x97\xAD\x66\xA4\xB3\x5A\xB3\xE9\x25\xB6\x75\x57\x6E\xBD\x08\xD8\xAF\xB5\x31\x07\x06\x19\xB4\x83\x0B\x77\xF5\xB0\x85\x9D\x1F\x65\x02\xD1\xA3\xB1\x89\x3D\x74\xA3\xB4\x8A\xB1\x60\x2A\xB7\x7E\x00\xBA\x55\xB0\x00\x38\xA7\xDD\xAC\xA5\x31\x00\x07\x34\xB5\x81\x04\x6B\xF5\xB3\xAD\xA2\xBC\x4B\xBA\x5C\x45\xBD\x5E\xB8\x63\xC0\xB6\xB0\xAF\xB0\x54\xBF\xB1\x87\xB6\x0A\xB9\xB0\x4A\xB7\x53\xA8\xB2\x4A\xB0\xDA\x9E\xBB\xA0\xBF\x78\xE5\x03\x9B\xB0\x01\xEE\xB3\x20\x2E\xB7\x3A\xB1\x6F\xA0\x03\xBC\xB6\xA8\xF5\xB1\xE8\x9B\x88\x5F\xAE\x4A\x90\x1B\x9F\x04\x03\x0B\x4E\x96\x8B\xA8\x10\x00\x04\x5F\xB9\xBA\xAE\xB3\x32\x01\x06\x18\x07\x93\x0B\x7C\x9A\xB5\x68\xA3\xAD\xD5\xA5\xF6\x8F\xBA\x11\xB4\x68\xA2\x5C\x2D\xA0\xB4\xB0\xAA\xE9\xBE\xB2\x43\xBA\x63\xBA\xAD\x35\xA0\xB3\xD9\xA8\xB8\xAB\x0D\x46\xB1\xA5\x21\x21\x97\xA3\xAA\x77\xB1\xFA\xB7\xB0\x80\xBB\x7D\xC0\x00\xF6\xB8\xBC\xDB\xBE\xB6\x9D\xBF\x44\xBA\x74\xE2\xBC\x7B\xBB\xA6\x8E\xB3\xEE\x8E\x65\xBA\xB5\x06\x2D\xBF\x9B\xB3\x01\x05\x03\x05\x81\xC0\xE7\xB8\x5C\xBA\xB6\x67\x5C\xB5\xD3\xBB\xC6\xA0\x01\x1C\xB9\x67\xC3\xB4\x08\x05\xB6\xA2\xBE\xEA\xA4\xBC\x0B\xB5\x64\xCB\xB5\x35\xBA\xB0\x58\xBD\xEB\x81\xAB\x4D\xBF\x77\xFA\x5C\xE6\xAB\xAF\xA2\xB5\x01\xC7\xBC\x06\x39\x78\xAC\xB1\x19\x07\xBF\x23\xAF\xF2\x8A\xBB\x1A\xBE\x74\xCA\xB8\x03\xD2\xBA\xDB\xA0\x02\xC0\xB2\xA6\xA3\x81\xD9\xBA\x91\xB5\xA6\xA8\xBF\xD9\x8D\xB2\x77\xA4\xBB\x2A\x87\xBE\x76\x16\xEC\x66\x07\xE2\x76\x6B\x10\x6B\xFD\x9D\x42\x06\xC2\xB5\xB6\xD9\x56\x16\x86\xA4\x3D\x77\x00\xE6\xB9\x4F\x79\xB5\xF6\xA2\x01\xA4\x95\x57\xA8\xAE\xB5\x0A\xAF\xF2\x21\xB7\x8F\xB1\x98\x50\xB2\x1C\x37\xEE\xAE\x0B\x3A\x09\x0D\x04\x51\xA4\x04\x11\x2B\x4F\x17\x00\xC3\x2C\x0B\x0C\xE9\x02\x8A\x0E\x02\x33\x00\x0C\x1E\x03\x27\x08\x0E\xDA\xB4\x34\xC2\x86\xA9\x78\x45\x0C\xC2\xC5\x1F\x09\xFF\xB0\x3D\xBC\x67\xD7\xC3\x6C\xAC\xAD\x7F\xB5\x9A\x99\xBF\x33\xC9\x85\xFF\xC1\xA1\xB2\xBF\x5A\xC0\xBA\x9D\x5C\xF0\x06\x2D\x5F\xC1\x46\x01\xC3\x6A\xC5\x0C\xD7\x1A\x42\xC0\x07\x10\xC6\x1D\xCE\xBD\x33\x01\x06\x26\xA1\x84\x0B\x89\xB5\xB4\x1D\xD1\xC4\x5E\xB5\x09\xFA\xC2\xAF\xAA\x73\x99\xAB\x02\x97\x42\x2B\x22\xB5\x96\x5F\xF8\x21\x51\xB6\xAE\x08\x1C\xAF\x8A\xC3\x7B\x0D\x39\xD8\x0D\x88\x8E\x8D\xE3\xBF\xC4\x97\xC2\x95\xB8\xC4\x32\xCE\x7A\xB1\x03\x14\x0F\x26\xBF\xC3\x0E\xCF\xC5\x34\xC7\x89\xCC\xC0\xFA\x06\xA9\xE6\x51\x3F\x28\x56\x79\x2D\x58\x84\xB3\x40\xB0\xAF\x89\xAC\xB0\xB7\xA5\x5D\xCB\x86\xDE\xB1\x9F\x48\xC6\xF5\x47\x28\x0B\xC7\x4A\x3D\x8C\xBB\xB7\x40\xAD\x28\x46\x16\xAE\x94\xC7\x3B\xC3\x52\x90\x55\xE0\xB0\xAE\xC9\xC2\x1B\xD6\x17\x6E\xC7\x80\x83\xAA\x11\x15\x8C\xE7\xC3\x03\xE3\xC7\xF3\xA5\x43\xA0\x7E\x6A\xA4\xB0\xDB\xA4\x65\x3C\x55\x75\xC2\x53\xF3\xC4\x3D\xA9\xA1\xE7\x87\x1E\xFB\xB4\xFC\xB9\x99\x52\x73\xB0\x00\x02\xFD\xC3\x18\xF5\xC2\x5E\xC4\x4F\xE6\xA3\x11\x02\xC8\x07\xC0\xE3\xBD\x2D\x35\x7C\x69\x08\xCA\x42\xBE\xC7\x23\xA9\x74\x33\x20\x93\xAF\x4E\x33\x20\x3F\xD7\xC8\x0A\xC8\x14\xF4\xA6\x6F\xBF\x76\xE0\xB5\x44", "\xBC\xAC\x52\x27\x23\xD3\xC7\x90\xC5\x8C\xD4\xA5\x06\xA4\x93\xF7\x7C\x24\xCE\xAC\xE8\xAF\xC2\x05\x23\x04\x39\x31\x2A\xCC\x12\xD6\xC4\x86\xC3\x52\xA6\xB0\x25\xDC\x34\xAA\xAA\x85\x64\x03\x60\xBB\x63\xA8\xB2\x08\x6D\x35\x25\x64\x81\x0C\xC7\x84\xC5\x89\xC4\xC4\x4F\xC8\xAD\x8E\xB2\xB5\xAA\x8E\x19\x14\x7E\xC3\x51\x4E\xD8\xC8\xD5\xA6\x12\x71\xAD\x6B\x5A\xEA\x60\x12\x40\xDD\x29\x42\x19\x10\xC1\xB4\xD4\xAC\x95\xE0\xCA\x57\xD4\xB1\x5D\xCC\x23\x06\xB4\x92\xA4\x5A\xB5\xBF\x4F\xD4\x22\x58\xC5\xD2\x09\xC5\x6D\xA6\xAC\x4B\xC8\x48\xCD\xCA\x0B\xCD\x1A\xCC\xA8\xD9\x87\x8E\xA8\x00\x08\x1E\xCB\x7A\xB7\xD8\x99\x65\x4D\x6D\xC9\x32\x66\x05\xC2\x01\x35\x24\xB8\x1E\x08\x8A\x08\x50\xA0\x01\x0A\x00\x01\x7C\x07\x2F\xFC\xB4\xC1\xC0\xC9\x6E\x00\x2C\x7E\x64\x0E\x2F\xA9\xAD\x0C\xA2\x09\x34\x8C\xCE\xA1\xAF\xCC\x8F\xCF\x2D\xC3\x17\xA0\xC5\x99\x82\xC5\x6C\xBE\xC3\xDA\xA9\x2F\x12\xCC\xC0\xCE\x7D\xC7\xB7\x2B\x65\xCC\x6C\x0F\xA9\x89\xCD\xCE\xC1\x8F\x8E\xCC\x64\xD2\xCC\x45\xCB\x06\xD9\xA9\xD7\xC1\xCB\x31\xCF\x40\xBB\xCC\x8A\xCD\x1A\xCD\xCC\xD0\xC0\x5D\x8B\x67\xFE\x56\xC8\x2B\xC8\x2F\xE2\xC9\x91\xAC\x97\xD9\xA6\x5F\xC0\xCC\xB5\xBC\x32\xDA\x64\xCB\xC0\x9B\x99\xCF\x40\xB3\xCD\x8B\xCD\x36\xCF\xCD\xC8\xC0\x98\xA6\xB2\x74\xC4\xCC\xBD\xCE\x3A\xEF\xA8\xCE\xC9\x9D\xC3\xCE\x6D\xC2\xCD\xC3\x0C\x34\xD3\xCE\xD3\xC6\x85\x85\xC5\x6A\xC4\x03\xAB\xC9\x11\xEE\xCD\xBC\x07\x99\x86\xCE\x6C\xD8\x03\xE4\xCA\x38\xDF\xCD\xDB\xC0\x98\xBC\xB3\x7C\xC4\x03\xF5\xCE\x37\xE3\xCF\xE0\xCE\x99\xB6\xAC\x71\xC5\xB8\xA3\x66\x2E\xC9\xCF\x9D\xCA\x97\xA3\xAA\x7E\xB2\xCC\xE5\xA3\x78\x9E\x10\xB2\x5D\x5C\x86\xC6\xE8\x46\xB4\x91\xC9\x42\xC3\x03\x09\xDC\xB5\x15\xD1\xF5\xAC\x3E\xD5\xA3\x07\x26\xCF\x57\xC6\x52\xB9\x43\x8E\x17\xCA\x2C\xCF\x29\xE2\x00\x51\xCA\x74\xF9\x4E\xFA\xBC\xBC\xA8\xCB\xFB\xAF\xBF\xF6\xC2\x97\x96\xD0\x88\xC8\xC4\x88\xB1\x16\xC6\x1E\x46\xCA\xA0\xBA\xCA\x53\xCD\xD0\xD5\xA4\x45\xD9\xAE\x17\xD2\x02\x0F\xD1\x84\xC4\x38\xA9\xC4\x9A\xAB\xC5\x41\x1D\x8A\xD5\xA4\x2C\xDB\xA6\xDB\x5B\x16\xC3\x66\x6E\xCC\x94\x8C\xD0\x39\xD4\xD1\x56\xD3\xD0\x91\xB3\x6A\xAE\x02\x24\xAD\x07\xDE\xCC\x7A\xB0\x3D\xCA\x0B\xB8\xC0\x94\xA7\xAF\x17\xAE\x03\xA7\xCE\x3D\xEA\x99\xD6\xA3\xA3\xE2\xD0\x48\x0A\xAF\xFF\x5C\xFB\xB3\xCB\x88\xA2\xC0\x47\xCE\x6E\xC5\xA7\x5F\xD7\xE7\xB6\xAF\xB9\xA2\x86\xF0\x00\x98\x15\xD3\xE2\xC1\x45\xC0\xD2\x1F\xD9\x97\x94\x0A\x6A\xBB\xD2\x22\x05\x4B\xF5\xA6\x10\xB5\x4D\xD3\x09\x95\xA2\xB3\x25\xCF\xB1\xA1\xD2\xD4\xCE\xE6\x63\xD2\x99\xC0\x09\x69\xD5\x46\xDA\xAF\x38\xDD\xA6\x94\xD5\x9C\xD8\xD1\xDE\xBD\xD4\x96\x61\x75\xC7\xA7\xA0\x01\x9E\xDE\xAD\xD7\xC8\x0F\x30\x09\x91\x30\xA8\xD2\xC4\xA1\xCB\xCE\x58\xD7\x47\xC6\xD4\x6A\xA3\x95\xE3\xD0\x1F\xD4\xD1\x40\xCE\x46\xD5\x32\xD7\xA3\x88\xB1\xD0\x20\xD2\xD3\x39\xD3\x9B\x81\x37\x1E\xD8\x95\xAF\xD7\x25\xC7\xD4\x69\xBC\x4B\xCF\xD4\xB7\xB3\x93\xB1\xC3\xC3\x44\xD6\x82\xD7\x4A\xC6\xD6\x5E\xC8\xAC\xC6\x3B\xF7\xA0\xB3\x32\xC9\xCB\xA0\x01\x2D\xB8\xA2\xCA\xCD\x4B\xD1\xD5\x85\xD3\xD0\xAD\x32\xAC\x0C\x6B\xEE\xD2\x1B\x0A\xAD\x86\x32\x35\xF9\xCD\x6D\xA4\x67\x37\x29\x5B\x0C\xC6\xA5\xD4\x27\x1A\xCD\x0D\x38\x07\x01\xD6\xB7\xCF\xCA\xD3\xD5\x1A\xE0\xB4\x12\x11\x9F\xEC\xC9\xA9\xC5\x45\xEC\xAF\x37\xE8\xD3\xFD\xCC\x9D\xC1\xD0\xC4\x04\xAD\x6A\x09\x9B\x87\xB6\x80\xDF\x54\xCE\x00\xC4\x0D\x0D\xE6\xC9\x34\xE8\xCD\x6E\x60\x26\x77\x17\x77\xAE\x67\x06\xCB\x38\x08\xCF\x7C\xD2\xAD\xF3\xC4\x99\xD0\xCB\x5F\xA6\x0C\x23\xC5\xC7\xA9\x8F\xAC\x54\xAD\x55\xC8\x55\xD2\x56\xD3\xB8\x8F\xDB\x5C\xD9\xC3\x73\xDD\xD7\x1B\xCF\x5F\xED\x22\xCD\xC3\x07\x36\x16\x79\xC5\xD8\x0D\xAB\x0E\x24\xAD\xB5\x8A\xB0\xD6\xB8\xC3\xDF\xCD\x73\x06\x61\xE6\xC1\x88\xDD\xA2\xE9\xAD\x99\xA9\x73\x41\x77\x0A\xDB\xCE\xDC\xC1\xB3\xAB\xD3\x31\xD0\xAE\xB6\x14\xCE\x59\xD9\x31\xDB\xB0\xB3\xD8\xD0\xD0\xC6\x37\xDC\x69\xFA\xD8\x83\xD3\x55\xC1\xD3\xD3\xC7\xDA\x7C\x71\x69\xD9\xC3\xAA\xD4\xAE\xD7\xD8\xC4\x18\xDA\xFB\xC9\x05\x1B\xD9\x62\xDC\xB2\xDA\xAE\xCB\xD1\xCF\x80\xC9\x66\xE4\xDB\x80\xDD\x51\xB5\xD9\x08\x39\xDA\x71\xDB\x6B\xEB\xD1\x83\xD2\xB3\xE5\xD9\xDD\xC2\xDA\x36\xD9\x6D\xC5\xDA\xFB\xA0\xB6\x97\x61\x9F\x6A\xDA\xFC\xCD\x9A\x8D\xDB\x22\x12\x16\x1C\xC8\xD2\xD5\x73\x70\xCB\x6E\xF4\xD8\xB4\xD6\xA0\x89\xDD\xCE\xDB\xD9\x7C\xDE\x69\xCD\xDC\xA8\xDF\xB8", "\xD3\xDB\x9B\xD2\xDC\x66\xDC\x0E\x14\xDC\xDB\xCA\xB6\xA9\xD9\xB8\xC6\xB9\x6D\xDD\x52\xEF\xD3\x97\xDF\xB2\x97\xDD\xDF\xD4\xDB\x22\x01\x09\x36\xDB\x9E\x08\xB7\x8A\xDE\xDE\xDC\xD9\xAF\xDB\x72\xD0\x19\xC0\xD5\xB9\xA1\xCC\xC0\xAE\xD1\x85\xDA\x6A\xD4\xC8\xB8\xCB\xB4\xF9\xDB\xCE\xDF\xDA\x11\xA9\x6A\xC7\xDD\xB1\xDE\xB3\xD6\xDB\xDF\xCF\xDA\x95\xD8\x67\xCB\xDD\xCC\xDC\xB8\xD1\xC5\xF0\xCB\xDE\x72\xC8\x74\xFF\xDB\xB3\xD0\xBD\xA4\xDF\xDA\xD1\xD6\x2B\xD8\x7C\xDF\xD9\xD1\xC2\x02\x0E\xD7\xE0\xC4\xD9\xC9\xD8\xCA\x62\xDA\x6E\xC5\xAA\x8C\x4C\x4C\x07\x03\x87\xCF\x0A\x0D\xB7\x35\x06\xAF\xD9\xD0\xEA\xC2\xDF\x2D\xDA\x2E\xE5\xDE\xBD\xD4\x70\x91\xAA\x5B\x5C\x4B\x88\x4B\x66\x55\xC9\xF6\xDB\xE4\x6F\xDD\xFC\xD3\xDF\xF5\xDA\x65\xCC\xA9\xF9\x82\xB2\xAF\xD3\x90\xC9\xAF\xC1\xD1\x7D\xFD\x08\x91\x23\xE6\x54\xD3\x5D\xD6\xDF\x19\xCF\x6E\xCE\xE0\x4A\xD9\x85\x91\xE0\x08\x09\x29\x5C\x70\x5A\xF7\xD6\x20\xD5\xBE\x8E\x09\x9D\x0D\xCB\x99\xD1\x57\xDB\xD5\xE6\xA3\x96\xE6\xD6\x54\xC3\x4F\x73\xD0\x04\x12\x2C\xC2\x2D\x58\x5D\xD4\x06\xF5\xA6\x13\x16\x18\x68\xE0\x5C\xD0\x97\xCB\xAD\x63\x2C\xCF\x2E\xE4\x9A\x97\x46\x32\x09\x8D\x31\xE1\x31\x53\x2C\x35\xE2\x84\xF7\xE1\x2F\xBB\xAC\xD7\xB1\xA4\xD0\xDA\xE2\xB7\xCC\xAE\x76\x2A\x28\x90\xB6\xC4\xC7\xC5\x03\x66\xC3\x1E\xEE\x00\x1B\x06\x03\x01\x02\xD7\x7E\xE2\xC2\xC3\x84\xD7\xD2\x11\x0A\x95\xE4\xC9\xB7\x49\xCB\x5F\xCB\x5A\x6A\xCB\x36\xD5\x96\xEA\xE1\x1A\xFE\x29\x4D\xD6\x5F\xD3\xD4\x35\xD0\xAF\x9E\xE1\x5D\xD5\x34\xA6\xD8\x56\xE2\x00\x06\xEB\xC3\x8F\xE0\x29\xDE\xE0\x62\x71\x84\x0D\xC5\x0B\xEA\xC0\x99\xE0\xED\xDB\xE0\x74\xE4\x7D\xC0\xE4\x2D\x73\x52\x15\x37\x20\xEB\xD0\x85\xE5\x51\xE6\xE1\x88\x0D\xC7\x9E\xD4\x0B\xFD\xD5\xEE\xCD\x56\xE0\x09\x3C\xB1\xAA\x91\xAB\x0C\xE7\x46\x86\x28\x8F\xC4\xE5\xD3\xD7\x55\xB2\x90\x1A\x15\xE4\x6A\xD7\x87\xED\xE0\xD4\xC3\xC4\xD9\x44\x27\xE6\xA9\x47\xE4\x86\xC8\x47\xC3\x27\x4A\xEE\x08\x0C\x18\xB7\xB6\xE6\x05\x35\x01\xE6\x99\x10\x3C\xE6\x27\xD9\x08\x30\x04\xA1\x92\x6D\xAE\xDE\xC7\xEE\xA8\x25\xD0\x01\xE3\xD9\x3D\xC5\xDD\x8D\x23\xBC\xA3\xCF\xB1\xAE\xDF\x2D\x1F\x30\xD9\x26\x90\x07\x06\x08\xAA\x52\x93\x86\x66\x03\x97\x97\x18\x58\xB3\x0B\x27\x09\x37\xFA\xB4\x17\x1C\xA1\xBC\x27\x1D\xE6\xA6\xE4\x3D\x13\xFF\xB6\x92\xD0\xFC\xBF\xDD\x3D\xCD\x03\x59\xA4\x6E\xA1\xE2\x6E\xDA\x7F\xDE\xBE\x36\x86\x6A\x6B\x02\x6A\xA0\x55\xEC\x6B\x9C\xA6\xD3\x48\x9D\x97\xA8\xAF\x60\x14\x35\x52\xC8\x1E\xF8\x6F\xDB\xC8\xCD\x81\xEA\x9C\x4B\x6F\x94\x6E\x36\xF8\xAD\x7C\xC7\xA9\x70\x3F\xFD\x5F\x02\x8E\xB6\x3E\x7B\x4E\x88\xE3\x9E\x76\x4E\x0B\x14\x01\x97\x99\x21\x19\xE9\x5A\xB1\xD1\xAC\xAC\x3D\xB1\xD0\xA1\x28\x2B\x6A\xAC\x65\x75\x8A\x06\xB5\xB6\xDB\xA8\x53\xB3\x64\xD5\xCB\xFA\x4C\x5A\xC0\x01\xF2\x34\xE8\x43\x55\x97\x8E\xB4\x58\xB5\x02\x2B\x81\x4D\xFA\xB4\x8E\xB0\xFD\xAD\x16\xE7\xC2\x99\xA7\xEA\x53\xA1\xCC\x56\xBA\xC3\x02\x51\x31\xC7\x98\x94\x21\x3B\xB1\xDE\xB8\xC9\x3A\xC1\xEB\x00\x5E\x06\x03\x52\xD6\xA3\xA8\x41\x04\xA9\xC3\x50\xE9\x1B\xB5\xBD\xDC\xE7\xBD\xE8\x05\x6B\xA4\xFF\xD5\x36\xD8\xD5\xA5\x42\x56\xE7\xC4\x87\xB6\xFB\xA9\xE9\xFA\xB1\x26\x4F\x66\x45\xBE\xCB\xF4\xE0\xA0\xD4\xA6\xE6\x5C\x5D\x91\xCF\xF0\x82\x31\x0B\x42\x0E\x28\xD7\xEF\x37\x9B\xA2\x02\x88\xD6\xCD\xF8\xBB\x42\x51\x68\x98\x7D\x78\xB1\x75\x2F\xB1\x75\xBA\xE5\x13\xC3\x09\x4E\xC7\x4B\xB1\x74\x43\xA6\xE7\x6D\xBE\x89\xF3\xC8\x33\xDA\xCE\xD4\xBE\x8B\xDD\x02\x79\xB5\x9D\xFC\xE1\xD1\xC9\xBF\xC0\xCA\x5D\xE6\xA9\xB6\x74\x8C\x78\x59\x33\xCD\x58\x54\xB4\x65\x37\xE8\xDE\x07\x24\x21\xED\x39\xCD\x58\x0C\xAB\x9A\xC7\xE7\x4F\xE7\x56\xFD\xB2\x40\xC7\x7D\xC0\xE0\xFB\xBF\xD5\xA0\xD4\xB4\xB7\xEB\x6D\xA4\x59\x2B\x21\x3F\xC5\xED\x23\xAF\xB4\xC9\xEC\x74\xEF\xA2\x89\xC3\xA0\xAD\xBF\x6D\xD7\xB5\xE0\xEB\xF9\xB1\xA2\xFD\xAE\x59\x58\x5C\x2F\xEB\x8A\x7D\xA5\x29\x67\xD1\x95\x07\x49\x0E\xEE\x9A\xB3\x8A\x4C\xA9\x90\x98\xDA\xB3\xCB\x58\xE5\xE6\x79\xB7\x41\xF2\xC9\x2B\x66\x29\x3D\xB7\x58\xD2\xC9\x66\x65\xBB\xF8\xAC\xC6\xE5\xDD\xF6\x63\x35\x59\x63\x94\x2F\xD0\x8F\xD3\x88\xAB\xC6\x11\x3D\x10\xC9\x32\x49\x43\x16\x4E\x33\xEC\x5C\x06\xDA\x32\x89\xDE\x10\x4E\x36\x05\x31\x00\x40\x07\x12\x7C\xEE\xA6\xB0\xEF\xF7\xEE\xCB\x22\x0A\x93\xBB\xCE\xFF\xE2\xF4\xB3\xEC\xE9\xCA\x57\xFD\x34\x5E\xD9\xC2\xBD\xE3\x87\xDB\xD5\xB1\xE8\xBA\x80\xF1", "\x30\x42\xE0\xEC\x03\x42\x43\x9E\xE0\x0C\x93\x43\xCA\xF1\x58\xE1\xC8\x1E\x86\xF9\x03\x6D\xC4\x09\x2B\x80\x11\xFA\x69\x9E\x5F\x87\xF4\xA7\xE4\xEA\xE9\x88\x42\xB8\x3D\xDA\xAD\xE0\xC0\xAB\xF1\x21\x25\x49\xFA\xB0\x23\xD8\x5A\xC8\xD1\xDD\x2A\xC5\x3E\x5E\xD0\xBC\xB2\xA8\x66\xD6\x03\xB7\x92\xD2\x11\x11\xAA\xC7\xAB\xEF\x6D\xDA\x78\x18\x5E\x4C\xA6\xF1\x2B\x60\xC5\xDF\xBE\xCC\xB0\xE3\xBD\x09\x44\xAE\xBF\xAE\xEC\xFA\x8D\xF2\xB5\xC8\xA3\xB4\xF3\x29\xCB\x47\x49\xD0\x04\x3F\xF0\x8D\x4A\xE3\xA8\xAC\x8F\xFC\x9B\x38\xF1\xF2\x01\xF2\x27\xD5\xA2\xC5\xF2\xDD\x5B\xBD\xC9\x6B\x9B\x17\x42\x55\xA9\xE6\x84\x3B\x45\xE3\x9B\x06\x08\xCE\xF7\xA5\x36\xF7\x85\x1F\xE8\x6A\xA1\xE9\xD5\x2B\xA4\xCD\x6E\x93\xE0\xA9\xD6\xED\x63\xEA\xC0\x50\xC5\xB8\xDF\xAE\xE8\x67\x85\x3B\xBC\x8C\x22\x31\xEE\x2A\x95\x87\xF4\xE6\xE4\x03\x0C\x9D\x42\x0E\xF4\xB5\xB3\xD1\xF2\x63\x3C\x03\xDD\xED\x2D\x75\xE7\xA7\xD7\xED\xC0\xEE\xAA\x33\xD2\xD9\xF0\xE6\xEA\xC7\xD7\xB8\xAB\xDE\x81\x02\x28\x08\x23\x77\x2D\x10\xD5\x36\x2A\x3C\x7B\x74\xEE\x54\xF9\x71\x2B\x3B\x6B\x11\x0D\x17\xE8\x11\x27\x08\x59\xF5\xE2\xA9\x39\xAB\xFC\x5E\x0C\xAE\x7C\x92\xD3\x73\xCE\xD3\xE9\xE4\x93\xF4\x37\x7B\xC4\x07\x1F\xC1\x74\x6E\x5B\xA2\x02\x0F\x12\xED\x25\xD6\xD6\xEA\x37\x5D\xF3\xD5\x7C\x59\xE3\xAC\xF5\xCB\xF4\xE5\x1F\x1F\x55\xFA\xEC\x9A\x3B\xAB\xFF\x1E\x5B\xE4\xD6\xC6\x08\x6D\xF7\x4B\xD0\xF6\xB5\xFB\x36\xDF\x19\xD7\xCE\xA8\x5E\xFD\xE7\x98\xF7\x9F\xE3\xB4\x53\xF5\x9A\x82\xF6\xA5\xBB\x5E\xB8\xBF\xB1\xE2\xF4\xC2\xD5\xDA\xEE\xF4\x70\xF0\xF1\x6E\x02\xF1\xA9\x08\x98\x2B\x99\xB4\x01\x39\xB3\x10\x73\xB1\x9D\xB0\xBE\xA5\xAC\x96\xBE\xED\xAF\xE7\xA1\xC1\xEC\xF5\xB1\xBF\x61\xEC\xFE\xA1\xBE\x46\xB9\xD7\xC3\x52\xFE\xB3\x47\xAE\xB6\xEE\x87\xBE\xBC\xB5\x03\x35\xBB\x40\x15\xB9\xF4\xAF\xE4\xA1\xB5\x22\xDE\x69\xA4\xD0\x74\xBE\xAF\xF2\xAD\xE5\x8C\xBC\xC7\xB3\xF1\x90\xBE\x0D\x08\xBA\x03\x08\xE9\x99\xF8\x80\xBC\x82\x9E\xB7\xC0\xFF\xB5\xC1\xB2\xC7\x8E\xC0\x19\xC3\x7A\xC9\xB5\x05\xDB\xBA\x19\xC1\x1E\xF7\xF7\xCC\x21\xF1\xBD\xC5\x0E\x06\xBB\x03\x0E\xEC\xAB\xF8\xEA\xB8\xA8\xDC\xB7\x6E\xEF\xE2\xC2\xD2\xEE\x8B\xBC\x73\xBD\x78\xB6\x16\xFF\xB2\x01\x34\x03\xF2\x8E\x5C\x81\x06\x79\xB1\xB3\x0A\xDB\xB5\x36\xB2\xE0\xEE\xC0\xCF\xB2\xF3\xA0\xBE\xBC\x55\xBA\x41\xB7\xEA\xA5\xBD\x9B\xFC\x6C\xCE\xB7\x92\xBB\xC1\x7D\x03\xE7\xE6\x2D\x9E\xFA\xDF\xB3\x01\x12\x12\x47\x6F\xFC\x00\xEF\xB0\x6B\xAC\x4E\x8A\xAD\x4E\xA9\xAF\xC7\xB6\xA5\xA2\x01\x75\xA2\x21\x08\xAB\xC6\xC1\xAD\xF6\xA7\xA0\x90\xAE\xA4\xA5\x51\xF8\xFA\xD5\xBA\xFB\x05\xAF\x9E\xAE\xA7\xBF\xFE\x61\xE3\xF6\xDD\xED\xAB\xA5\xD2\xEF\xDE\xA9\xC5\xF8\x82\x8A\xDE\x4D\xAC\xEF\x5C\xAD\xF0\xE0\xFA\xA6\xA2\xF9\xC0\xA8\xE3\xF3\xFB\x35\xAD\x6B\xF7\xA8\xB6\xAA\xF9\x91\xC1\xD8\xFA\xFB\x3F\xAD\x6B\xFD\x03\xCF\xFE\x65\xC4\xAA\x51\xA3\xFC\x99\xFC\x9F\x91\xFD\xB0\xA0\x55\xEB\x84\xE5\xE6\xAF\x0C\xA8\xAB\x9A\xAA\xD8\xF4\xFA\xB2\xFD\xDE\xF4\xFD\x63\xA9\xAB\x9A\xC0\xD6\xFC\x50\xE9\xA9\x15\xC3\xFD\x7C\xAD\xF4\xF3\xFC\xC0\xA2\x02\x74\xA9\x35\xF7\xFD\x96\xBE\x9E\x4F\xFC\xE5\xFF\xFB\xCC\xFE\x60\xBE\xFB\x95\xFA\x04\x08\xAD\xE9\xFE\xFB\x87\xFC\xED\xF1\xAC\xD1\xC3\xF5\xD5\xFD\x5E\xF5\x9C\xC8\x66\x30\x7A\xD3\xFD\xA1\xFB\xC0\xF9\x03\xFB\xDA\x85\xB6\xC1\xEA\xC0\x08\xFC\xB8\xD9\xF4\xEA\xB6\x7F\xAB\xE8\xC2\x01\xB0\x94\xAA\xE3\xFC\xD6\x11\x0D\xBF\xD1\xAE\xC1\xBB\xB8\x86\x1C\xFE\x75\x80\x78\x5C\x24\x5B\xC5\x51\x51\x59\x5C\x79\x10\x00\x85\x5D\x43\x7D\x0A\x60\x08\x62\x02\x2E\x57\x8A\x63\xCA\x51\x94\x2D\x58\xB8\x7F\xCD\x54\x7D\x4E\x80\x0F\x6A\xC7\x74\xDB\x7D\x5C\xFF\x57\x04\x89\xFE\x55\x80\x57\x7F\x01\x66\x63\x5C\x5E\x50\x5C\xD7\x70\x83\x44\x5B\xA1\x5D\xA9\x65\x83\x66\x5E\x03\x54\x06\x69\xB0\x03\x7F\xD9\x7D\x9E\x63\xEC\x5B\x7C\x26\x5B\xBA\x64\xA7\x48\x5E\xA7\x5B\x8A\x5B\x00\xB6\x5A\x56\x7E\x01\x66\x24\x08\x60\x5B\x7D\xCC\x77\x02\x8F\x60\x29\x81\xCD\x78\x75\x6C\x80\x38\x61\xB3\x59\x7A\x68\x7D\xC4\x7E\x05\x8A\x80\x45\x7D\xD8\x69\xB9\x70\x77\x5B\x6B\x4A\x7C\x05\x85\x67\x6C\x5D\xE4\x7D\xB8\x54\x50\x23\x5B\x68\x5B\x0E\x81\x5A\x75\x5E\xB7\x5C\x04\x7A\x5B\x45\x5F\xAC\x5D\xC9\x7E\x7A\x72\x00\x70\x5B\x49\x0E\xEF\x5B\x5A\xEB\x7F\xFA\x57\xF0\x5B\x75\x51\x78\xFC\x70\xDB\x49\x7C\x6B\x5C\xE6\x55\xFF\x4D\x7C\xF7\x0B\xC3\x7D\xA5\x3D\x7C\x4F\x7D\x0D\x0C\xEF\x59", "\x1E\x54\x7C\x1B\x89\x7E\x6A\x76\xC2\x75\xC1\x76\x9A\x79\x5A\x85\x83\x8D\x69\xF0\x4B\x79\x64\x75\xAB\x76\xFF\x49\x29\x21\x11\x0F\x6A\x84\x72\x13\xCF\x22\x10\x61\x57\x04\x61\x31\x03\x0C\x08\x84\x43\x04\x48\x61\x61\x7F\x83\x72\x13\x78\x62\x13\x67\xBE\x6A\x5F\x79\x58\x15\x6F\xFC\x5E\x7A\x1D\x71\x27\x7F\x80\x5C\x61\x02\x70\x15\x1E\x88\x62\x71\x58\x73\x24\x6A\xC5\x75\x00\x31\x02\x1C\x66\x10\x36\x82\x90\x70\x29\x71\xA4\x79\x61\xA3\x81\xC0\x70\xA3\x6E\x67\x32\x68\x10\x7E\xAB\x43\x77\x31\x73\x22\x68\x3C\x35\x62\xA9\x44\xA5\x53\x8F\x59\x71\xE0\x6E\x2E\x72\x03\x1A\x03\x27\x04\x34\x81\xC6\x4B\x71\x42\x6A\xA6\x7A\x73\x6D\x76\x57\x7B\xD6\x09\xE5\x5B\x79\x57\x07\x5A\x63\xE4\x51\x69\xD2\x7A\x25\x33\xCA\x7A\x71\xD5\x82\x63\x70\xC1\x4F\x68\x50\x79\x36\x8E\x13\x1B\x83\x39\x7A\x2B\x6F\x0D\xB2\x62\xE1\x80\x32\x88\x24\x77\x62\xE0\x6E\x2E\x6D\x0C\xB8\x00\xB1\x03\x0A\x49\x0F\x93\x83\x91\x73\x15\x75\xAD\x4C\x06\x79\x5A\xA2\x6C\x69\x40\x5E\xA8\x72\xA6\x6F\xE9\x5E\x77\x98\x68\x82\x73\xA6\x7E\x70\xBB\x69\xA7\x69\xCA\x50\x78\x8B\x82\xA8\x6A\xC1\x17\x61\xC7\x5B\xA9\x69\x5E\x7C\x69\x6D\x02\x9F\x65\x06\x2D\x6A\xF2\x60\xF8\x67\xBF\x70\x82\xFF\x82\x45\x01\x10\x9E\x69\x8C\x6B\xFE\x67\xE9\x68\x74\x6E\x64\x07\x72\x97\x57\x6A\x03\x6E\xA7\x7C\xA9\x42\x83\x0F\x87\x82\x71\xE1\x52\x84\x80\x5C\x45\x86\x75\x56\x84\x7B\x69\x35\x58\x11\x2B\x6A\x93\x18\x47\x8F\x0A\x99\x69\xF6\x80\x2C\x80\x6B\x7E\x77\x06\x04\x51\x89\x0B\xB0\x6A\xFE\x80\xAD\x63\x9E\x11\x61\x37\x5B\x30\x86\x08\xAB\x72\xC0\x83\x1C\x84\xDC\x71\x7B\x9D\x06\x3C\x1F\x13\xAA\x6C\xCC\x82\x50\x82\x76\x66\x4A\x09\x04\x57\x8F\xCB\x70\x82\x1F\x85\x96\x61\x12\xAA\x5D\xCA\x6B\xD1\x7D\xAC\x44\x5B\xCF\x68\x1E\x76\xC5\x4B\x83\xB2\x81\x33\x81\x03\x31\x00\x5E\x87\x40\x0E\x15\x87\x85\xDF\x69\x52\x80\x02\x11\x59\x6B\x5D\x14\x8C\xAC\x5A\x6B\xDC\x6A\x55\x8B\x16\xA0\x6F\x59\x85\x96\x6A\xDF\x72\x00\x3B\x52\x41\x05\x18\xB4\x85\xF8\x69\xDB\x63\xAE\x64\x85\x23\x80\x3C\x79\xAE\x70\x67\x36\x80\x08\x0D\xAE\x45\x3A\x40\x65\x45\x80\x07\x33\x6B\x13\x09\xBD\x61\x53\x7F\x85\xB0\x81\x60\x8A\xB2\x6D\x7D\xA5\x03\x49\x01\x1A\xBC\x83\xBA\x82\x5D\x89\x73\x6D\x6E\x09\x6D\xEE\x62\xB0\x75\x6E\x7B\x6D\xD7\x6E\xAF\x5A\x6F\x22\x02\xD0\x60\xB1\x42\x6E\xF0\x70\xC5\x64\x9B\x17\x6C\x14\x1C\xF6\x6E\x85\x5C\x86\x59\x6A\x67\x81\xAE\x7A\x77\x34\x00\xB7\x49\x10\x02\x87\x5F\x87\x0D\x76\x1A\xB5\x71\xF4\x46\x4A\x75\xB2\x6D\x2A\x7E\x85\x32\x84\x0F\x9D\x86\x6D\x86\x56\x85\x03\x3E\x00\x2B\x40\x75\x84\x1A\x88\x85\xA9\x6C\xBC\x6C\xBA\x5A\x6D\x3D\x6D\xD8\x7F\xB3\x75\x6D\xBC\x6E\x6D\x62\xBD\x77\x6E\x7C\x6C\x6C\x82\xBB\x40\x6E\x1A\x72\x55\x75\xCC\x5C\x6E\x61\x6C\xE4\x63\x9A\x45\x6F\xB6\x6F\xF1\x6B\xB9\x57\x6F\xEB\x6D\x65\x8D\xBC\x7E\x6D\xB1\x6D\xD0\x6D\xBD\x70\x87\xAE\x6D\x6B\x82\x1F\x96\x6F\x12\x72\xE1\x65\x1F\x91\x6E\xF7\x84\xEC\x67\x1E\x9C\x6F\x9B\x6D\xEF\x67\x15\xA1\x6B\xBE\x84\x28\x6A\xDF\x76\x00\xA3\x51\x42\x01\x21\x85\x87\xFD\x81\x76\x8A\xC8\x66\x6F\xEB\x87\x32\x71\xE5\x0D\x73\xE9\x67\x33\x75\xC0\x51\x73\x19\x58\x02\x7B\x19\x8E\x87\x57\x71\x83\x87\x89\x7A\x77\x37\x01\x61\x83\x10\x07\x86\x57\x71\x58\x8A\xB2\x49\x73\x4A\x05\x9E\x56\xBE\x7C\x7F\xFD\x57\x5E\x24\x2B\x07\x39\x36\x85\xD8\x70\xCD\x70\x6F\x21\x8B\x64\x0F\x51\x7C\x86\x2A\x6D\x25\x8A\xC5\x7D\x5E\x17\x05\x5E\x04\xBB\x02\x5F\xFE\x60\xF1\x5B\x4B\x76\x72\xB8\x70\x30\x7A\xDF\x42\x03\x2B\x40\x94\x81\xC6\x41\x73\xD4\x53\xBC\x53\x8F\x5F\x6F\x70\x00\x95\x85\x4D\x6B\x00\x99\x68\x32\x74\x4D\x53\x3A\xAA\x67\x36\x5E\xE8\x2F\x6B\xD9\x6F\x4D\x87\x19\x83\x54\x46\x12\x47\x0C\x8B\x58\x7F\x77\x66\x96\x82\x02\x2D\x00\x5D\x8A\x6A\x50\x26\xB0\x67\x62\x8A\xBB\x69\x23\x8C\x55\xF2\x6B\x33\x6D\x32\x36\x06\x05\x68\x96\x8E\x26\xB8\x6E\xC7\x72\x9C\x8D\x7B\x21\x89\x11\x57\x98\x87\x27\x99\x54\x79\x89\x35\x52\xB4\x6C\x89\xC9\x66\x9B\x83\xCC\x6A\x74\x81\x89\x65\x70\x97\x5A\x88\x03\x8A\x33\x76\x75\x7B\x88\xD2\x71\x56\x04\xCD\x4C\x8A\xC7\x72\x30\x78\x2B\x24\x56\xCF\x55\xA4\x81\xCF\x40\x65\xB4\x76\x8D\x8C\x4F\x5D\x61\x04\x8A\x8E\x8F\x21\xBC\x88\x73\x56\xA6\x85\x85\x62\x7F\x40\x89\xB8\x61\x14\x82\x86\x32\x01\x46\x49\x10\x36\x8A\x14\x8A\x2E\x8E\x0B\x96\x89\xA9\x82\x08\x0B\x20\xA0\x62\xB3\x8B\x67\x83\x03\x37\x49\x09\x04\xB1\x89\x2B\xBA\x71\x06", "\x59\xAE\x58\x9A\x42\x65\x44\x66\x03\x65\x93\x52\x10\x24\x32\x02\x1A\x94\x60\x2E\x4D\x24\x4C\x77\x2F\x32\x74\xE3\x26\x7E\x77\xD3\x46\x04\xDB\x8B\x2D\x59\xD3\x65\x63\x77\x58\x2D\x5F\xB2\x64\x7F\x40\x75\xD8\x72\xD4\x4D\x75\x44\x75\xC3\x69\x63\x07\x75\xE2\x85\x52\x7D\x1D\x8C\x55\xE7\x8A\x53\x77\x83\x62\x00\x51\x77\x50\x74\xD5\x44\x6D\x7C\x59\x57\x7C\xAF\x4A\x78\x6C\x68\x10\x7A\x2F\x9E\x68\xF1\x7D\x22\x63\xFF\x4A\x60\x6A\x4A\x8C\x29\x5E\x68\x75\xFF\x72\x61\x03\xD7\x4D\x20\x04\x77\x80\x05\x7F\x02\x20\x0B\x8C\xFC\x15\xD7\x77\x75\x8F\x64\x1E\x86\xA3\x11\x1E\xBF\x89\x2E\x63\x4B\x17\x71\x17\x76\x04\x0B\x02\x5E\x8C\xD7\x87\xB7\x64\xC6\x61\x09\x9E\x5B\x17\x0D\xC6\x7E\x14\x6F\x71\x58\x6C\xE0\x66\x71\x3D\x0C\x1A\x78\x96\x66\x65\x54\x7A\xE5\x75\x10\xAA\x70\x07\x86\x1D\x7F\xAC\x22\x72\x88\x84\x09\x75\xC6\x66\x8C\x67\x70\xCC\x89\x32\x94\x2B\x0C\x79\xAE\x57\x32\x82\x0D\x3F\x8D\xCC\x82\xC7\x69\x84\x89\x72\x65\x7A\x0A\xB7\x71\xBB\x84\x89\x83\x8F\x41\x8B\xBF\x85\x0D\x00\x32\x8F\x0B\x6B\x3D\xCE\x83\xC6\x4D\x67\xE2\x8A\xBB\x85\xAA\x43\x66\xD4\x65\x78\x67\x98\x58\x67\xFA\x64\x52\x7D\x9D\x6F\x8B\x19\x54\xD7\x81\xA0\x62\x67\xB1\x6D\xBB\x04\xA0\x5A\x67\xE7\x67\xB2\x85\x9A\x50\x85\x06\x86\x6A\x6D\xBA\x6D\x66\x56\x5C\x6F\x68\x99\x5F\x8D\xF8\x67\xDA\x8C\x1A\xBE\x67\x75\x8C\x7D\x65\x9D\x47\x66\xC0\x64\x6D\x64\xB4\x48\x68\xAC\x32\x5A\x8E\x34\xB5\x83\x1B\x8E\x16\x76\x03\x38\x01\x27\x04\xE3\x81\x32\xAA\x68\xFA\x55\xD6\x8A\xA1\x5C\x68\x97\x0F\xBE\x8F\xE0\x72\x84\xB7\x67\xE4\x8E\x15\x14\x68\xDC\x54\xBF\x81\x51\x57\x76\xFB\x66\x06\x8A\x65\x54\x78\xBD\x2B\x70\x09\x31\xBC\x62\x50\x8E\x83\x87\x03\x2C\x03\x27\x04\xEB\x8F\x38\xA4\x70\xA2\x60\x22\x86\x0E\xB6\x57\xAA\x76\x53\x80\xA2\x4E\x84\x9A\x69\xC0\x8E\xC1\x46\x83\x1D\x07\x23\x7D\x22\xA3\x54\xB1\x8D\x2F\x86\xE5\x76\x78\x91\x1D\x98\x78\xB9\x31\x71\xEF\x80\xF4\x2B\xEB\x72\x83\x79\x4B\x73\x8D\x1B\x91\x87\x82\x85\xE4\x56\x2C\x83\x04\xC6\x8A\xD5\x86\x8D\x61\x10\xC9\x84\x53\x8D\x0B\xAA\x82\x81\x71\x4F\x0C\x3C\xB3\x4A\xCA\x80\x60\x80\x3D\x9F\x86\x31\x01\x0E\x09\x31\x49\x04\xE7\x8F\xB1\x82\x32\xB9\x27\x1D\x7C\xD2\x86\x10\xBD\x8A\xEC\x87\x46\x8D\xC8\x5C\x1A\xDF\x8E\xB7\x41\x3E\x90\x87\x49\x24\xC7\x82\x03\x30\x00\x07\x51\x42\x0D\x3F\xAA\x8F\x2A\x6B\x89\x44\xC9\x5A\x8F\x2E\x87\x25\x7D\xE0\x54\x76\x20\x02\x26\x77\xAE\x5E\x70\x9F\x72\x34\x2D\x1C\xB3\x83\x25\x8B\xF8\x8F\x1B\x89\x5F\x9B\x82\x40\x0D\x09\xBF\x8E\x38\x72\x29\x7D\x3E\x87\x90\x09\x7B\x0A\x7C\x5D\x70\x8D\x2A\x71\x2B\x7E\x13\x06\x71\xA6\x72\x03\x96\x38\x90\x90\x6C\x85\xFE\x8A\xC5\x68\x81\xFF\x45\x42\x0D\x42\x80\x90\x24\x72\xD1\x79\x05\x89\x6F\x51\x71\x83\x37\x50\x2A\x3B\xCF\x0A\x32\x53\x09\x95\x1A\x41\x63\x0E\x9C\x69\x3A\x77\xAA\x03\x0A\x41\x44\x9A\x5A\x3E\x90\x15\x1F\x8F\x60\x44\x64\x52\x43\x60\x91\x7F\x80\xF8\x5E\x73\x27\x2E\x3D\x68\x45\x93\xB0\x0C\x50\x48\x48\xED\x53\x1C\x7F\x3E\xB2\x73\x26\x55\xBB\x6B\x69\x14\x71\x32\x55\x14\x93\x1C\x39\x7A\xCA\x4E\xF4\x0E\xBB\x07\x58\x7A\x58\xB9\x8E\x7D\x6F\x73\x09\x8E\x3D\x7B\xD6\x74\x75\x50\x6B\xEB\x2B\x3C\x47\x67\x5D\x93\x27\x85\x69\x21\x82\x2A\x76\x9E\x53\x85\x51\x0E\x1C\x93\x42\x83\x2A\xA0\x6C\xAA\x81\xC7\x2A\xB2\x18\x05\x39\x66\x17\x9A\x14\x39\x7A\xA4\x56\xA2\x63\x43\x9B\x6B\xDC\x1D\xF4\x1F\x1E\x0C\x63\x92\x82\x1C\x9C\x69\x3D\x90\x8E\x90\x15\x1F\x66\x53\x4B\x09\x04\x25\x99\x84\x51\x92\x52\x93\x61\x5A\x69\x1B\x90\x0A\x87\x9B\x62\x29\xA4\x6F\xAA\x82\x16\x98\x43\xBD\x0B\x3A\x90\x26\x93\x1C\x10\x92\x43\x62\x3C\x1D\x86\x69\x4F\x09\x04\x2B\x97\x49\xA9\x92\x73\x93\x48\x54\x02\x21\x91\xB1\x2E\xCB\x7F\xA2\x66\x91\xEE\x72\x3F\x75\xCF\x51\x8C\xA1\x59\x1B\x9C\xBB\x22\x91\xC8\x2E\x3C\x1D\x48\xB0\x92\x8F\x92\x59\x16\x09\x8F\x15\x44\x60\x0D\x05\x41\x81\x04\x17\x92\x20\x90\x12\x34\x91\xB2\x8C\xA0\x70\xC1\x52\x61\xA6\x81\x1E\x9E\x49\xBB\x91\xA0\x93\x16\x6E\xB1\x28\x8A\xC3\x0B\x30\x97\x09\xB2\x13\xA8\x93\x37\x95\x69\x3A\x72\x3E\x49\x42\x05\x4E\xAF\x92\xE2\x90\xA7\x14\x48\xA3\x84\x66\x84\x5F\x89\x48\xB2\x1E\x8D\x30\xC4\x77\x3F\xB7\x72\x30\x5D\x2E\x72\x03\x1C\x03\x27\x04\x3E\x93\x25\x8C\x54\x5C\x8A\xB2\x80\xCC\x42\x8A\xF9\x04\xA1\x80\x02\x06\x8A\xCC\x6D\xD8\x79\x28\xA2\x00\x69\x8B\x25\x66\xAF\x6E\x89\x70\x8A\x3F\x99\x25\x80\x94\x92\x28\x9D", "\x85\x28\xB6\x89\x05\x94\x9E\x87\x26\x8A\x8A\x7B\x8B\x9A\x8E\xAA\x76\x72\x4C\x63\xC1\x6E\x50\x9E\x89\xA6\x6B\xA0\x82\x51\x83\x94\x14\x95\x99\x86\x50\x97\x94\xB1\x84\xDF\x69\xF6\x75\x72\xC0\x71\x93\x89\x25\xAD\x61\xCA\x03\x49\x01\x53\xBB\x93\x29\x63\xA7\x81\x4D\x83\x5A\x2E\x6A\xA8\x87\x10\x94\x8A\xEE\x85\x87\x87\x29\xAB\x8A\x99\x8B\x4E\x0F\x2A\x8C\x65\x8E\x8A\x4D\x9E\x5C\x71\x89\x9F\x92\x32\x7E\xBF\x66\x8A\x01\x70\x20\x95\x51\x99\x54\x98\x8B\x53\x53\xCD\x6F\x8A\xD7\x73\xC5\x0D\xBF\x18\x73\x83\x87\x37\x76\x10\x1A\x95\xB7\x51\x38\x73\x52\x63\x73\xBD\x75\x35\x58\xD8\x64\x8B\xE7\x7B\x3D\x70\xC1\x52\x76\x90\x75\x27\x97\xAE\x49\x95\xB6\x6B\x3C\x79\x46\xB7\x73\x8A\x47\x40\x7B\xCF\x47\x74\x3C\x75\x5A\x7A\x30\xB4\x6A\x02\x75\x3E\x74\xD0\x57\x0C\x06\x77\x64\x30\xA8\x0A\x74\xD0\x54\xA7\x2D\x80\x3D\x52\x17\x37\x4B\x08\xE6\x74\x34\x18\x37\x45\x7A\x01\x2B\x40\x8B\x96\xA6\x55\x58\xB4\x01\xB9\x79\xE2\x4E\x06\x18\x34\x27\x87\x4F\x7C\xFE\x7F\x8B\x9D\x8F\xE5\x86\xD0\x2D\x78\x83\x60\x66\x9C\x5E\x5E\x8E\xC0\x6A\x58\x73\xDB\x47\x80\x88\x96\x61\x9A\x50\x4F\x96\x91\x95\x65\x0F\x05\x0A\x4E\x5D\x6C\xB9\x87\x59\x95\x74\xAC\x54\xC1\x70\xA2\x50\x79\x2D\x72\x67\x92\x5B\x90\x84\xF2\x7F\x68\x90\x02\x0F\x96\x17\x78\x44\x3C\x06\x1C\x78\xBE\x97\x45\x76\x05\x2B\x40\xC3\x96\x63\x91\xD0\x2D\x09\xA9\x95\x7F\x0C\xD3\x62\x00\xAF\x48\xB6\x19\x4D\x51\x66\xE4\x7F\x63\x6A\xDA\x76\x96\x9E\x8C\x67\x91\x5B\x54\x97\x9A\x96\x8C\x79\x88\x76\x95\x6A\x90\x08\x0C\xD6\x77\x5F\xA4\x95\x7F\x06\xDB\x67\x96\xC7\x94\x51\x09\x5C\xB0\x04\xCB\x95\x73\x9B\x1A\x0F\x97\xED\x93\x46\x52\x5D\xAF\x96\x43\x2A\x7D\x27\x5B\x8B\x78\xB4\x95\x67\x90\x5B\x99\x75\xA0\x95\x84\x7C\x5D\xBC\x92\xFC\x6A\x44\x62\x5E\xB5\x1D\x0F\x76\x67\x92\x49\x43\x04\x92\x52\xB5\x82\x23\x16\x74\x44\x8B\xEF\x59\xBD\x02\x5F\x9E\x96\x0F\x04\x7C\x6F\x74\x8E\x58\xB6\x83\xA4\x3A\x72\x76\x3D\x57\x8A\x67\x1E\x8B\xE3\x26\x4E\x73\x06\x3C\x74\x7E\x66\x6B\x94\x36\xA5\x53\xF1\x89\xBA\x8F\x8C\x6B\x8B\xAC\x86\x52\x76\x2E\x92\x75\x22\x99\x35\x55\x2F\xA8\x8B\xF7\x8A\xE0\x69\x2F\xB7\x97\x5E\x75\x75\x9B\x32\x86\x98\xEE\x25\x6C\x99\x5F\x8B\x82\x03\x8F\xA0\x55\x30\x8F\x5A\x07\x8E\x2E\x9A\xD6\x5E\x97\x74\x76\x5B\x7E\x30\x80\x20\xF6\x1E\x5C\x7B\x46\x8C\x8C\x91\x64\xE8\x85\x31\x83\x57\x7A\x76\x91\x7A\x50\x5F\x8B\xD5\x50\xF4\x53\x2E\x92\x81\x96\x97\x87\x9A\x4D\x68\x98\x4F\x76\xA2\x84\x62\x84\x6C\x5A\x8F\xB1\x51\x62\x99\x99\xF4\x88\x8A\x9D\x62\x96\x75\x2F\x99\x7C\x96\x63\x99\x97\xC4\x5C\x57\x70\x63\x96\x8E\xBA\x8E\x58\x75\x56\x94\x53\x3B\x9A\x6F\x58\x30\xBB\x92\x47\x9A\xC4\x82\x64\xB0\x75\x45\x98\x7F\x9D\x5C\x49\x99\x14\x8F\x23\x8C\xA2\x0C\x2E\x6B\x2B\x5B\x77\x86\x1E\x05\x21\x3E\xA0\x93\x8B\x17\x74\xBE\x02\xD7\x39\x68\xA5\x78\xA4\x8C\x3D\x5D\xBA\x6C\x68\xC7\x5B\xAD\x55\x78\x28\x6A\xD5\x50\x02\x82\x2D\x59\x05\xAC\x84\x8B\x64\x23\xA5\x6A\x92\x9A\x08\x24\x69\xA2\x00\xD2\x54\x14\x08\x69\x82\x6E\xD3\x97\x9A\x90\x30\xAC\x76\x33\x98\x76\x9D\x66\xA4\x91\xE0\x5F\x84\x73\x68\x9F\x05\x5F\x19\x50\x66\xDF\x64\x8E\x4C\x23\x8C\x9E\x6A\xB2\x77\xB1\x98\x35\x58\x84\x01\x78\xB0\x9A\x58\x0A\x5D\xBB\x97\x75\x99\x2F\x93\x3A\xAF\x9A\xE3\x95\xB7\x7D\x68\x94\x53\x8F\x98\x2F\x81\x69\xA4\x8E\x9F\x9A\xA5\x92\x6A\x83\x56\x62\x8F\x2E\x82\x0A\x9B\x9A\xCB\x9B\xAB\x9F\x69\xA1\x9A\xA3\x9A\x55\x75\x6A\xA6\x99\xF8\x94\x9A\x95\x5F\x97\x97\xA6\x99\x66\x9B\x6A\x9E\x77\xAD\x9B\xAC\x9F\x6A\x8E\x19\xB2\x9A\x92\x14\x6B\x9F\x19\x62\x67\x20\x67\x6B\xB8\x21\xE8\x9A\xAE\x96\x6E\xB8\x9A\xBE\x9A\x9C\x60\x6C\x80\x99\x0C\x8E\xB0\x64\x3A\x82\x34\x9F\x16\x32\x5E\x68\x5C\x78\x33\x76\xD8\x5B\x2D\x83\x04\xDD\x88\x8D\x9F\x4C\xA0\x8B\x3B\x75\x7C\x6E\x61\xA5\x6A\x5F\x9B\xBC\x86\xD4\x65\x98\x56\x99\xC3\x97\x98\x6B\x98\x53\x76\x81\x08\x2F\x90\x65\xE1\x9B\x67\x98\x66\xAA\x99\xDC\x99\x8C\x98\x66\x91\x78\x39\x9B\xA2\x51\xA3\x3C\x98\xF6\x57\x9C\x9F\x63\x9F\x97\x0D\x8C\x9E\x90\x31\x81\x9B\xFC\x68\x9F\x99\x4D\x4B\x99\x20\x02\xA3\x5B\x42\x00\x01\x57\x95\x1A\x94\x6D\x69\x91\xFA\x76\x2E\x07\x12\x3A\x9C\xFF\x75\x3D\x7C\x50\x51\x8E\xA6\x62\xB7\x0A\x67\x98\x8E\xA7\x56\x4C\x6C\x6A\x08\x10\xE4\x04\x1B\x0C\x08\xA0\x8E\x42\x79\x16\x95\xCF\x5E\x0B\x32\x55\x1A\x9F\x73\x99\x53\xE9\x82\xD0\x9C\x72\x90\x84\x45\x9D\x9F\x77\x74", "\xAE\x1A\x4A\x9F\x58\x7C\x74\xA4\x79\x12\x7B\xD3\x9E\xA8\x3F\x21\x6F\x76\x02\x25\x64\xBB\x5E\x43\x99\x5C\x7A\xDF\x58\x4D\x09\x04\xDB\x95\x6B\x69\x9D\x45\x9A\xA3\x95\x4D\x64\x00\xEC\x94\xFB\x42\x3C\x6F\x4F\xE7\x40\x48\x4C\xDB\x6A\x6D\x3E\x9B\x5D\x98\x6F\x92\x8C\xFA\x9A\xD9\x92\x80\x2F\x3C\x03\x34\xA5\x5E\xD7\x64\x9D\x80\x74\x0D\x02\xD8\x42\x04\x84\x76\x2A\x49\x96\x47\x76\x46\x05\x65\x9F\x58\x69\x78\xEB\x86\x8E\x5D\xCE\x4E\x94\x34\x8D\x07\x7A\x5B\x99\x76\x70\x37\x66\x74\x59\x1E\x76\x8D\x16\x2E\x7A\x22\x8F\x1D\x81\x80\x65\x16\xDA\x4D\x16\x92\x9D\x58\x9D\xFE\x4F\x85\x83\x61\x22\x88\x5B\x9A\x61\x79\x5A\x6E\x95\xDB\x5A\x76\x3E\x52\x32\x5F\x79\xA9\x5B\x9F\x76\x0D\x03\x7A\x84\x04\xA5\x9C\x6E\x75\x4D\x7A\x76\x0B\x9F\xCB\x7B\x71\x87\x82\xDA\x5E\x54\x82\x30\xB2\x9E\xC7\x76\xDD\x29\xDC\x53\x7A\xCB\x77\xA4\x7A\xCB\x50\x77\x06\x04\xF4\x97\x4B\x52\x77\x23\x54\x75\x7D\x5E\xBF\x74\x6F\x98\x08\x04\xA4\x40\x9D\xDB\x75\x98\x0D\xDD\x66\x69\xD9\x5C\x78\x7E\x7D\xA3\x90\xE3\x74\x23\x82\x93\x66\x77\x95\x32\x1E\x3D\x5C\x4D\x9D\xB0\x7E\x8C\x1D\xEC\x53\x2E\x8D\x5F\xBB\x95\x78\x33\x77\x4F\x21\x7D\x7A\x6E\xA7\x9B\x5F\x1B\x9B\x54\x14\x83\x04\x46\x86\xFD\x91\xDF\x70\x9B\x5F\x18\x81\x73\x3B\x92\x6A\xF1\x5A\xD6\x70\xCF\x41\x83\x20\x92\x83\x73\x6E\xAC\x6B\xF3\x98\x00\xA2\x16\x17\x78\x48\x7B\x86\x71\x68\x91\xA0\x20\x78\x5C\x83\xE2\x55\x8D\x1D\x79\x47\x07\xE2\x54\x53\xE4\x77\x4D\x99\x6E\xA8\x7F\xED\x9B\xAF\x7F\x76\x31\x78\xC0\x6B\xF0\x88\x8A\x77\x78\x4A\x69\x3B\x8C\x79\x5F\x79\xA4\x12\x8F\x79\xE3\x6C\x9F\xC2\x6A\x99\x71\x5F\x07\x79\x19\x79\x92\x7C\x81\x8C\x82\xD9\x57\x94\x71\x82\x9E\xA0\xF2\x9B\x08\xAE\xE4\x65\xA0\xD9\x53\x91\x67\x82\x85\x8F\x29\xA2\x98\x7D\xE5\x6F\x44\x65\x34\x98\x75\x84\x87\x8F\xEA\x75\x99\x76\x79\x11\x1E\x10\xA1\x0D\xA2\x81\x82\x46\x19\xA3\x1C\x0F\xE1\x6F\x59\x24\x7A\x41\x09\x85\x9D\x7B\x52\xA0\xA5\x77\x83\xA1\x9C\x3D\xA0\x08\xA3\x63\xAF\x78\xC0\x7B\x0F\xA5\xE5\x5E\x5A\x42\xA0\x96\x78\x82\x9A\x79\x2A\xA3\x8E\x79\x84\xAD\xA0\xC6\x8F\xF5\x2D\x84\x90\x57\x9E\x2D\xB1\x95\x85\x9B\xA0\xE4\x9A\x08\xA2\x86\xAF\x7F\xE8\x79\x19\xA1\x33\xB3\x78\x54\x9D\x1A\xAA\x0D\xAB\xA1\xDC\x83\x8A\x07\x84\xAC\xA0\x51\x09\x1C\xAC\x8A\x73\xA1\x31\xA3\x13\xA6\xE4\x56\x71\x74\x7B\x3A\x2C\xE6\x44\x7A\xEB\x22\x2E\x70\xE7\x43\x04\x72\x78\x12\xA4\xDD\x35\x79\xD4\x50\x48\x76\xA1\x3A\x79\x43\x34\x9F\x7B\x17\xA8\x74\xD9\x9C\x91\x6A\x5B\x91\xA2\x5B\x0D\x15\x74\x22\x92\x7A\x32\x1A\xA2\x7E\x5F\x2E\x17\xBA\x70\xA4\x73\x10\x10\x7A\xB7\x50\x2B\xAE\x5E\x15\x7A\x3C\x05\xEA\x90\x86\x9A\x9F\xE9\x54\xA7\x75\x32\xAA\x84\x40\x65\xA8\x72\x05\x64\x7A\x08\x1B\x19\x0F\xD2\x63\x7A\xA5\x79\x82\x1D\x4B\x48\xA3\xC5\xA2\x7E\x70\x02\x1E\x3D\xCF\xA2\xA6\x5C\x8C\xAC\x2A\x09\x1B\xD4\x99\x67\x43\x79\xB6\xA3\x84\x17\xE3\x55\x9B\xF7\x17\x92\x18\xF3\x6F\x80\xB5\x64\x37\xA9\x60\x35\x69\x4F\x56\xA9\x5A\x81\x72\x54\xD3\xA3\x7D\x13\x75\xB0\x58\x39\x09\xC7\x78\x8D\xAF\xA2\xDA\xA1\xF1\x82\x8E\xB8\x17\x1B\x0B\xE9\x5A\x04\xBA\x60\x8D\x67\x3C\xA4\x8E\x83\x54\xE6\xA1\x3C\x68\x8E\x84\xA3\xD4\xA3\x19\x0B\x8E\xBE\x87\x8B\x69\xA7\x57\x8D\xA6\x54\xD9\xA3\x18\x32\x8F\x96\x5D\x83\x1D\x37\xA5\x8F\xAD\x80\x5C\x5D\x38\xAC\x90\x85\xA3\xFB\xA2\xA2\x80\x31\x3D\xA3\x76\x55\x3A\xA5\x8D\x8E\x68\xA4\x56\x0A\x63\x96\x44\xA4\x03\x86\x07\x67\x90\x90\x57\x09\xA7\x1C\x31\x5F\x1C\x9A\xC5\xA2\x37\xA5\xF6\x4B\x81\xF9\xA3\x44\xA1\x90\x95\xA4\x29\x94\x1D\x08\x91\xAE\x53\xC7\xA0\x40\xA7\x5F\x0B\xA3\x36\xA5\x82\x1F\x66\x66\x02\x2B\x40\x4F\xA2\x8D\xB9\xA4\x02\xA4\x47\xA9\x67\x5E\xA4\xEF\xA3\x8F\x11\x8F\x98\x2E\x28\xA5\x40\xAA\x92\x89\x81\x66\x7E\xEA\x56\x5B\x7A\xA3\x16\x31\x39\xA8\x03\xA7\xA3\x0A\x56\x46\xA1\x94\x97\x83\x5C\x6C\x49\x8D\x69\x60\x9D\xDB\x51\x49\xA4\xC5\x03\x0A\x49\xA6\x43\xA9\x23\x1F\xA3\x1C\x5A\xA1\x50\x95\x9A\x30\x0D\x6F\x45\xA3\x95\xBE\xA3\x55\xA4\x50\xA6\x8D\xAC\xA3\x58\x04\x69\x59\x7D\x60\xA4\x32\x80\x57\xAE\xC9\x70\xA3\x0A\xA4\x52\xA3\x8F\x8B\xA5\xA0\x9B\x3D\xA7\xF6\x6D\xA4\x61\x7D\x43\xA3\x8E\x91\xA5\xCF\x62\x5A\xA4\x82\x7B\x7E\x7D\x03\xA9\x72\xEF\x6A\x7A\xF5\x9E\xB7\x73\xEF\x6C\x1B\xBA\x72\xB6\x73\x10\x1C\x7B\xC3\x4F\x62\xAB\xEB\x62\x7B\xBB\x7A\x2E\xA9\x7D\xA9\x7B\x22\x02\xB0\x7C\x83\x81\x5C\x13\x1D\xB1\x7F\xEE\x60\x8E", "\xF1\x78\xC6\x11\xED\x57\x7B\xF5\x7A\x62\xA6\x9A\x9F\x7B\xEC\x18\xB5\x7B\x9A\x8F\xA6\xB0\x7B\x0D\x02\x99\x82\x04\x94\xA6\x63\xA8\xEB\x72\x92\x8E\x7F\xF5\x9E\xEB\x6A\x78\x7E\xA2\xBA\x73\x03\xA4\x08\xA2\xA5\xC7\x7A\x5B\xB6\xA6\xCC\x79\xDD\x1A\xF6\x6A\x1A\x6C\x7E\x0C\x06\x03\x3F\x81\x1B\x21\x20\x8F\x7C\x43\x82\xEC\x7E\xEB\x9B\xE0\x7C\xA1\xF3\x95\x6D\x58\x63\xBC\x56\x9F\xA7\x1D\x8C\x64\x8E\x7C\x91\x83\x8E\x27\x4C\x8B\x0D\x94\x83\x5F\x1F\x9D\x9B\x63\x3F\x91\x0C\x05\x03\x0B\x93\x00\x01\x33\x96\x4A\x83\x92\xC0\x8C\x2F\x8B\x1E\xB6\x91\xD5\x90\xE6\x9E\xE0\x75\x8C\x7D\x90\x2B\x8E\x54\xAC\x39\x68\x41\x5C\x45\xB9\x31\x06\x1C\x7A\xDF\x20\xEB\x71\x00\xBE\x73\x40\x0E\xCB\x77\x52\xFE\xA5\xB8\x70\x3C\xBB\xA7\x0F\x55\xB7\x54\x65\x92\x6A\x56\x78\x3B\x86\x84\xAE\x83\xEF\x54\x82\xA5\xEF\x6F\x74\x87\x9F\x57\x2E\x78\xB0\x8C\xFA\x77\xE2\x91\x10\x0D\x9E\x86\x77\x48\x56\xCE\x4A\xA8\xA3\xA2\x53\x54\x79\x96\x83\x96\x9E\x35\x9B\x56\x98\x93\xE9\x64\x69\xA1\x51\x5C\x9E\x98\x2F\x55\x97\x7B\xB8\x7B\xB6\x9D\xE8\x91\x03\x3B\x9E\xB7\x21\xEF\x9C\x18\x27\x9E\x8C\x06\xA7\x51\x7C\x85\x9F\xEE\x7D\x1C\x8F\xDB\x46\x9F\x39\x6A\x8A\xA0\x02\x33\x9E\x7B\x75\xE1\x9D\x78\x4A\x77\x64\x9C\x73\x71\x03\x10\x9F\x03\x06\xF4\x9C\x31\x53\x7A\xB8\xA0\x1C\x0A\xA3\x8B\xA8\x38\xA2\x35\x8C\xF1\x66\x85\xDC\x77\x08\x90\x7E\x95\x77\xE1\x74\xF9\x99\x87\xA6\x85\xE8\x9E\x0F\x1A\x7E\x9C\x57\x30\xA0\xE6\x7E\x7E\x80\x9A\x54\xA0\xAF\x95\x68\xBC\x9A\xFA\x77\xA2\x96\x10\x2E\xA9\xC6\x9B\xAB\x92\x77\x80\x66\x90\x9A\x4B\xA3\x8B\x0D\x9B\xF6\x31\x1E\x19\x6D\xAD\x8B\x74\xA8\x2F\x84\x6D\xB6\xA9\x78\x23\xB5\x96\x70\x7B\xA9\xA0\x66\xF6\x85\x66\xAC\x74\xDD\x98\x02\xA6\x5F\x9D\x9C\x6C\x98\x90\xAE\x7D\x54\x9E\xF2\x9E\x08\x21\x6F\xA0\x00\xBB\x9B\xBA\x95\x6F\xAD\x69\x91\xAB\x12\x29\x6B\x94\xAA\x0D\xA3\xFC\x9C\x6E\xB6\x9B\x6F\x97\xD5\x9C\x5D\x7A\x9B\xC4\x99\xDD\x17\xE4\x47\x9B\xFD\x69\x9D\xA1\x98\x8C\x9B\x17\x85\xA5\x99\xA7\x97\x9A\xD0\x98\x9F\xA2\x6D\xA0\x8A\x56\x99\xA7\x9B\x23\x02\xAA\x45\x10\xA1\xAE\x98\x46\xAA\x18\x9C\xA3\xA7\x6A\xBD\xA8\xB5\x95\xC6\x95\x9D\x9A\x97\x39\x68\xA4\xAD\xA9\x92\xAA\x9B\xA9\xA5\xA8\x7F\x97\xAA\x40\x71\xA6\xA8\xDF\x49\xAB\xC7\xAA\xA6\xA5\x6F\x88\x62\xF7\x98\xCA\x94\xAA\xB3\x22\x2B\x10\x87\x7A\xA6\xAD\x13\x86\x98\x1E\x2F\x66\x5E\x01\x2B\x40\xB8\xAC\x68\xB2\xA9\xC8\x98\x6E\x6A\xAA\x8C\x55\xB6\xAA\x18\x2D\xAA\x8D\x7F\xAF\xAB\xB3\x99\x69\xB9\x61\x03\x5D\xAD\xAC\xAA\xB9\x84\xA0\x9B\xA0\xA1\xAB\x84\x67\xDB\x98\xA2\xAE\x71\x8A\xAA\xE0\x9A\xAF\xA2\x6E\x8E\xAA\xAC\x99\x6C\x5E\xAC\x95\x78\x1F\xA0\xAF\x95\x6B\x98\xAA\xD1\xAB\xB3\xA2\x16\x05\xAC\x96\xAA\x9C\x20\xAA\xB4\x99\x7F\x9E\xB0\x98\x48\xA5\xAA\xD1\x3A\x85\xAF\x89\x05\x1E\xBB\x5F\xC5\xA2\x82\x3A\x77\x53\x49\x42\x0D\xB1\xB5\x5A\x1A\xAF\x8E\x09\xFB\x52\x1C\xE8\x95\xAE\x51\xAA\x91\xAC\xFD\x95\x44\x51\xB2\xA8\x21\x9D\x9D\xED\x94\x69\x5E\x2E\xD4\x5A\xE7\x2A\xDF\x7A\x93\x06\x04\xCD\xAC\x85\x88\x0F\xC2\x70\x78\x03\xA5\xA1\xA8\x8F\x57\xBC\x54\x81\xA5\x6A\x21\x27\x53\x5E\xB9\x00\xA6\xE8\xAB\xBC\xAF\x58\x7E\x54\x1B\x19\x4A\x56\x57\x5E\x2E\xE2\x71\x66\xA0\xA2\x8A\x76\xE7\x52\xCF\xAD\x85\x80\xAD\x9A\x1B\xBC\x61\x0E\x84\xAD\x19\x55\xBA\xAE\x15\x38\xA9\xE1\x56\xBB\xAE\x4E\x57\x95\x30\xAD\xBA\x52\xB3\xB2\x00\x13\x8B\x40\x03\x21\xB7\xAC\x1D\x05\xD3\xA7\xB5\x8F\xAD\xBC\x77\xA6\x92\xB5\x9E\x78\x2B\x30\xD5\xAA\x9A\x42\x6C\x57\xAE\x59\xA0\xA8\x93\x9A\xEB\xA8\xB6\x90\x6D\x8B\x89\x80\x08\x2E\x70\x28\x3A\x77\x7A\x03\x49\x01\xB8\xB3\x61\x80\x0A\x69\x70\x28\x3B\xAC\x50\xAC\x4A\x7F\xA0\x67\x61\x80\x08\xE2\x01\x04\x2A\x56\x6E\x2D\x20\x6C\xB8\xAD\x24\x6D\x03\xE3\xA4\x4D\x51\xAE\xDE\x80\xCF\x50\x8F\x1B\xA3\x56\x5D\xD0\xA5\x98\xA5\x0B\x61\x05\xB4\x55\xCB\x7D\xAD\xF5\x93\xDF\xA2\x03\x13\x02\x27\x04\xEA\xA4\xB8\xA3\x08\x43\x55\x51\x0E\x32\x07\xAE\x6C\xAD\x6A\x7B\xB8\xB7\x24\x96\x06\xE5\xA0\x02\x18\xAE\x11\x68\xED\xA5\xB9\x90\xAE\x8A\x05\x93\x69\xBB\x8D\xAE\x8A\x06\x10\x0C\xBB\xB6\x23\x99\xAF\xC7\x72\x90\x3A\xA5\x9D\xAD\xD5\xAE\x8E\x6E\xAE\x08\x54\xBE\x59\xE6\x6F\x74\x69\x7A\x7E\x7C\x32\x49\x04\xD3\xAD\xAD\x59\xE6\x45\x7F\xD2\x10\xE2\xAD\xB6\x96\x79\xA8\xA3\x08\x94\x4D\x7E\x36\x5B\x0C\xF2\x86\x52\x69\x79\xEF\x9D\x38\x3F\xB2\x96\xA6\xE1\x82\x6B\xAA\x70\x29\x7A\xBB\x7A", "\x7E\x73\x9B\x81\x04\xB5\xA4\xFA\xA8\x9A\x98\xA6\x6B\xAE\x6E\xA5\xA5\x92\x79\xBD\xA5\x67\xAF\x9B\x8C\x06\xC1\xA4\xBC\x7A\x65\x72\xAF\xF4\x78\xAB\x34\x69\x78\x79\xB3\x14\x87\x74\xC0\xB0\x04\xFA\x75\xDB\x49\x10\x0A\xB0\x91\x7A\x85\x2C\x50\x40\x01\xDA\xAC\x35\x58\x5A\x2F\x6F\xAB\x16\xF9\x94\xA5\xA6\x69\xEE\x8E\x0A\x75\x63\x67\x91\x24\xA6\x85\x2A\xAD\x8C\x35\x6B\xA8\x53\x3E\xBE\xB3\x7A\x81\x82\xE7\x24\x70\x18\xAF\x34\x4E\x13\xA0\xF0\x29\xA2\x72\xAC\x7C\x6D\x2A\xA9\xB0\xAE\x6A\x09\xBC\x89\xB5\x53\xD0\x48\xD0\x47\x8E\x4D\xA2\x2B\xB2\x4F\x0D\x58\x5E\xAE\xD5\x53\x13\x05\xC3\xB6\x1F\x3F\x8B\x2A\xA8\x97\x80\x05\xAE\xA2\x51\xA0\x60\x3A\x77\xB2\xA2\x94\x11\x08\x9E\xA5\x51\xA9\x04\xBE\xE7\x6A\x74\xBE\xA2\x5A\x90\x23\xAF\x69\xC2\xA2\x55\xA7\x3A\x95\x63\x26\x88\x2F\x6D\x86\x72\x00\xFB\x82\x41\x0D\xC5\x96\x8F\x2E\x89\xB8\x63\x16\x8A\x6B\x79\x59\x5D\xA6\x45\x99\x9E\x2B\x85\x3D\x5D\x12\x96\x72\xD3\xA4\x4C\x86\x10\x9F\x6A\x11\x87\x0D\x83\x11\x8F\x95\x78\x6A\x05\x3D\x6C\xBD\x69\x7F\x68\xA3\x6D\x11\xA0\x85\xD8\x55\xDB\x68\xA8\x5D\x69\x65\xB1\x49\x86\xBE\x4B\x9C\xA8\x81\x1A\xB7\xA6\x66\xA8\x70\x69\x43\x8E\xC6\xB4\x8C\x70\xB3\x54\x82\xC7\xB5\x84\x74\xB2\xA9\x66\xC7\xAB\xAB\x3B\x84\xAB\x16\x40\x3E\x84\xB1\x88\x28\x69\xC5\x95\x63\x6D\x63\x0C\x0B\x7F\x82\x04\xFD\x9C\xDB\x68\xBF\x49\x90\x30\x72\x2F\x8D\x87\x51\x85\xC0\xA8\x26\x79\x3B\x80\xAC\x74\xA3\xB2\x1F\x40\x8D\x8F\x11\x92\x0A\x9D\x0C\xB3\x00\x34\x01\x5C\x84\x33\x25\x9E\x1E\x85\x1F\xB3\xCA\xBF\xB1\x4E\xB2\xB6\x65\xB1\x2F\xB2\xE0\x8E\xF3\x88\x15\x92\x90\x0E\x8B\x0C\x05\x03\x36\xB2\xE5\x28\x2E\xBC\xC7\xA0\x6B\xA0\x63\x18\xBC\xC4\x71\xAE\x67\x84\x15\x87\x73\x00\xB3\xF6\x8E\x30\xBC\x20\x84\xB3\x27\x8B\x0C\x0A\x7B\xA7\x04\x2C\x8A\x28\xB0\x12\xB4\x6A\x4D\x14\xB9\x69\xF5\x52\xB1\x6B\x77\x50\x07\x68\x03\x81\x93\x87\xA3\x36\x1F\xA7\x94\x98\x84\x86\x11\xC4\xA8\x90\xE2\x8E\x2C\xB2\x14\xB3\x00\x37\x01\x16\xA2\x17\x98\xA0\xDE\xB2\x58\x83\x78\x7C\x6B\xA8\x87\xC0\x66\x1E\x83\x6C\xD1\x98\x48\xA9\x1A\xB0\x86\xB2\x84\x40\xBE\xBD\x64\xB3\x20\x02\x6D\x86\xB1\x58\x5C\x18\x6C\x87\x8A\x14\x39\x71\x75\x85\xEA\x68\x5F\x7D\xB3\x56\x9B\x77\x89\x36\x99\x9A\x99\x6F\x40\xB5\x20\xA9\xA5\xD9\x19\xC4\x62\x9F\x88\x90\x0A\xB4\x55\x6C\xD0\xB9\x86\x95\x8A\xE9\x89\xC9\x97\x62\x9B\xB0\x1B\x63\x03\x38\x00\xA3\x86\x41\x0D\xD2\xA0\xB1\xBA\xB3\x37\xB0\x9A\xBC\xB3\x4C\x6E\x3F\xBB\xD1\xAB\x86\x5C\x98\x9D\xAE\x51\xB2\x8C\xAA\x86\x45\xAD\xD1\xB4\x86\x13\x6F\x69\x25\xB1\x62\xB4\x07\x81\x43\xBE\xE7\x2E\x82\x27\xB4\x2F\x69\xD2\x98\x62\x39\x00\x71\x83\x10\x04\x87\x30\xB4\x33\xB7\xAC\x6C\x95\x6F\x69\xC8\x65\x32\x96\x83\xCB\x87\xC9\x68\xD4\x87\x8E\xF8\x8E\x54\x2C\x31\xB4\x00\x6F\x62\xD7\x3E\x07\x17\x98\x18\x93\x71\x82\x97\x5B\x87\xC6\x6D\x4F\xB9\x1F\xA1\x87\xFC\x87\xF4\x6D\xB5\x66\x87\x41\x6F\xEE\x69\x1E\x87\xB4\x19\x89\x80\x82\xBC\x47\xB5\xEF\x86\xE5\x6B\xB8\x48\x6F\x1F\x71\xE7\x6E\xD0\x9F\x6E\x37\xB7\xF3\x69\x20\xB2\xAA\xFD\x84\xEE\x6A\xB9\x40\x88\x7D\xB5\x7B\x8E\xB9\x67\x6B\x70\xB6\xD0\x63\xBA\x60\x66\x10\xB5\x62\x83\xCA\x87\x84\x68\xB5\x7C\x8A\xD6\xB2\x6E\x6C\xB6\x5E\xB4\x1E\xAF\xB5\x81\xB5\x7E\x88\x1E\x87\x72\xBD\x6F\x67\xA0\xBC\x76\xB5\xBA\x84\xF1\x6A\xD9\xBF\x87\x8E\x6E\x62\xBF\xD7\x8C\xB6\x9D\xB7\x79\x8B\x1F\xA7\xB6\x59\xA6\xD7\x63\x1F\xA4\xB6\x25\xB4\xD5\x6D\xDA\xB1\xB5\xA2\x6F\x6B\xB9\x02\x17\xB1\x92\x62\x3C\xB2\x18\xB4\x00\x31\x02\x2F\x08\xF5\x02\xB7\xAF\x8D\xC7\x63\xD9\xAF\x6D\xDB\x86\xEB\x60\xD7\x99\xB6\xE3\x85\xC7\x78\xBB\x4D\xB6\x72\xB4\x68\xB4\xBA\x63\x82\xF4\x85\x4F\x93\xA6\x6D\xB5\xB7\x6C\x5F\xBA\xBC\x75\xB6\x80\xB6\x77\x8E\xBC\x5E\xB6\xAF\xB5\x73\xB1\xDB\x87\xB6\xA9\xB6\x80\x86\xDD\x9D\xB7\x4C\x56\x45\xB7\x20\xB9\xB6\x83\xB4\x64\xB3\x0E\x91\xB4\xC7\xB7\x59\xB0\xB7\x56\xB6\xCB\xB7\x5C\xB8\xDD\x98\x6E\x9C\xB6\x77\xB8\x1F\xAB\xB7\x99\xB6\xEF\x63\x80\xB1\x8F\x77\xB4\xE2\x6D\xDC\xB9\x59\xD5\x6D\x79\xB1\xE0\x91\xB2\xEA\xB6\x7E\x8D\xDE\xB0\xB6\x20\xA5\x81\xB0\xE0\xA5\xB6\x96\x8A\x7E\xB6\x20\xB8\xB6\x8F\xB6\x63\x61\xD9\x83\x6A\x16\x88\x50\x65\xD9\x8A\xB7\xB7\xB4\x73\xBC\x1D\xB1\xB6\xD0\xB7\xD0\x64\x1B\x98\xB5\xB4\xB7\x79\xB7\xAE\x77\xB7\xB2\xB4\x62\xBB\xDD\xA6\xB8\x97\xB6\x82\xB1\xFE\x44\xB6\x1B\x64\x81\xB4\xBD\x5A\xB7\x7E\xB4\x5E\xBE", "\x53\x92\xB8\xBA\x6C\x7B\xBF\xE2\x90\xB6\x49\xB4\x16\xB8\xCD\x9A\xB1\x0E\x5D\xD9\xAF\xA2\x0A\xB3\xC6\x85\x86\xB0\xB2\x4E\x6A\xA2\xB6\xD1\x61\x20\x8C\x73\x36\xBA\x6D\xBA\x2A\x98\x07\x20\x89\x0B\x82\x22\xAF\x53\x3D\xB9\x6F\xBE\xD5\x9A\x71\x34\x03\x0C\x04\xA3\x9D\xB3\xB9\xB2\x54\xB4\xAD\x54\xB5\x0B\x90\x92\xB7\x54\x9F\x7C\x4C\x94\x8E\x81\xC9\x91\x95\x52\xBA\x8F\x8B\x7A\x63\x7C\xB6\x73\x2B\x80\x03\x2D\x52\xAF\x51\x91\x80\x7C\x65\x26\x48\x88\x30\x7E\x60\xA4\x81\x6C\xB9\x4B\x95\x4F\x8E\x89\x34\x00\x2A\x0B\x02\x7E\xB9\x34\x97\x96\x88\x54\xA1\x94\x01\x97\x48\x94\x50\xAC\x6F\x96\x87\x53\x59\x50\x9A\x94\x7B\xB0\x43\x93\xE8\xB3\x89\xD0\x57\xA1\xB3\xC0\x49\xBA\x7A\x8B\x19\x0C\x27\xAC\xA5\x8D\x89\x47\x94\xCC\x76\x72\x10\x96\xA4\x11\xE9\xA5\x94\x93\xBA\x99\x8C\xD1\x8B\x94\x9E\x89\x5C\xA3\x0A\xBA\x94\x59\x60\x4F\x9B\xD8\x8D\x56\x68\xB9\xA5\x9E\x2A\x8F\x7F\x8D\xB9\xA9\xBE\x1A\xA1\x8A\x9C\xB8\x98\xB4\xE6\xBD\x04\x00\x72\x99\xB8\xE8\xBF\x94\x50\xB8\xAB\x8E\xEA\x82\x95\xB0\xBB\x92\x89\x11\x31\x00\x2E\x96\xB5\x51\x03\x12\x7D\xD5\x2E\x32\xB1\x03\x34\x53\xBC\x89\x96\x88\x25\x8B\xBB\x31\xB5\x0C\x02\x95\x61\xB3\x52\x5A\x77\x52\x2A\x8F\x86\x12\x78\xA0\x14\x26\xAB\xB3\x16\x97\x7D\x62\xA5\x8B\x7E\xC2\xB8\x1C\x04\xEC\xBB\xB9\xE2\xBB\x45\x76\x2E\x49\x04\xE7\xBB\x57\x80\xED\xB4\x68\xD2\xB8\x38\xBE\x66\x1D\x57\x83\xB8\xB6\xBC\xAE\x5A\xBB\xA4\x68\xA5\xBA\x13\x99\x04\x08\x54\x84\x93\x9E\x12\x98\xF7\x0B\x9B\x53\x70\x82\x04\x05\x9C\x94\x96\x67\x49\x9C\x53\x98\xCF\xAA\x3D\x9E\x99\x58\x9A\xC3\x9B\x65\x81\xB4\x26\x98\xBC\x89\xF0\x93\x9C\x62\x9A\xC5\x9E\x62\xBD\xAA\xFA\xA9\xA3\xA9\xCA\xBD\xAB\x15\xBF\xAF\xA7\xA1\x60\x9C\xD9\x9D\x9C\x9D\x63\x95\xAB\x41\x98\x6A\x50\x77\xAB\x9C\x28\xAF\x9E\x92\xE8\x70\x9C\x32\x9F\x8D\x25\x2D\x91\x98\x64\x9F\x4C\x73\x03\x3F\xBB\x01\x05\xC0\xB9\x61\x88\x9C\x1B\x9A\xC2\x94\xA5\xA5\x8B\x0E\xBF\x50\x70\x66\x8F\x9C\x39\xB7\x8B\x68\xF0\xBA\xBC\xF3\x88\xC5\x95\xB4\x12\xBC\xA1\xB7\x55\x72\xAC\xA0\x96\x1C\x9D\xC6\xBF\xAF\x84\x83\x41\xA9\xC7\xB5\xD6\x46\x8C\x25\x9D\xDF\x9D\x5D\xA8\x9C\x77\x9A\xE0\x9E\xBD\xA5\xBC\x6D\x77\xC9\xBE\x67\xB8\x0B\x68\xAB\x75\x4C\x33\xAD\x8C\x30\x8D\xA1\x93\x34\xA0\x09\xFA\x76\x91\x49\x10\x26\xBD\xB5\x5B\xD8\xB7\x5E\x7D\x7A\x91\x74\x22\xB8\x96\x51\x64\x11\x56\xDA\xBC\xDB\xB1\x82\xBE\xB7\x67\x82\x03\x37\x00\x26\x02\xD7\x39\xF7\x85\xB7\x5E\x59\x73\x6D\xAF\x4D\xBC\x65\x8D\x65\x67\x36\xB8\x8D\xF9\x65\x81\x64\xD8\x9E\x67\x56\x5E\xD9\x8F\x37\xB3\x6B\x85\xBC\xDB\x8C\x77\xB0\x73\x5C\x8F\x22\xB3\x9F\xB2\x8D\xB8\x64\xDD\x81\xF6\x76\x8D\xF6\x65\xAA\x6D\xF8\xBB\x8D\x56\x98\xE6\xB2\xA0\x69\x8D\x9B\xBE\xE0\x64\x38\xA2\x83\x51\xB6\x08\x0E\xF7\xAD\x6E\x80\xBD\x39\x5A\xF8\x9E\x8D\xF7\x65\xE8\xB1\xD0\x88\xBE\x61\x7F\xEA\xB7\x37\x8C\xBE\x7A\x8D\xDA\x6F\xD1\x9D\x90\x91\xBD\x02\xA8\x40\xAC\x1A\xFD\x6A\xE5\xBC\x54\x5E\xBE\x68\x8C\xD8\x86\xF8\xBC\x87\x7C\x8F\xE5\xBE\x37\xAC\xBE\x02\x6E\xEB\xB3\xDD\xA3\xBE\xF5\x8C\xBD\x47\x3F\x8F\x8F\x75\xBF\x6F\x84\x03\x34\x00\xD3\x8F\xEE\x34\xE4\x91\x72\x7B\x70\xF6\x8D\xC0\x7E\x82\xEF\xA4\xF7\x8C\xC8\x55\x70\x4D\x8C\x3C\xBD\xD5\x8C\x27\x5F\xB5\x0D\x09\x3E\x83\x04\xE9\x8D\xE9\xBC\x3E\xA4\x82\x08\xB4\x7D\xA5\xDE\x9B\x39\x24\x14\x35\xBE\xFC\x96\xB3\x9A\xB3\x8F\xBC\xC9\xB4\x00\x36\x03\xFF\x83\x10\x3F\x8F\xA5\xBE\x00\x97\xCA\x6C\xBF\x05\x93\x07\x9A\xCA\xAA\x70\x0A\x91\x0C\x7D\x40\x89\x71\x27\x90\x2C\xB9\x42\x97\xB9\xCD\x80\x0D\x07\x03\x28\xA7\x17\x90\x56\x6C\x5C\x9A\x90\x00\xC0\x1B\xB2\x65\x43\xC0\x0E\x7A\x08\x92\xD7\x5E\x70\xB1\x70\x28\x70\x9D\x1D\x93\xDE\xA6\x33\x9E\x06\x0D\x42\x00\x02\x47\x13\x9E\x84\x61\x09\x99\x5E\x05\xD4\x00\x00\xC2\x5E\x08\xC7\xE7\xB3\xBD\x4B\xB7\xFF\x5E\x00\x17\x1A\x33\xC0\xDF\xB6\x8C\x73\xB6\x20\x01\x3A\x60\x9E\xA6\x94\x4C\x56\x33\x6A\x28\x90\x6F\x58\x8B\x12\x77\x8D\x68\x63\xD9\x63\x0E\xCC\xED\x99\x54\x3E\xC2\x08\x00\x8E\x71\x63\x41\xC0\xF6\xB6\x8E\x58\x63\xE7\x2B\xA1\x85\x4E\x49\xC1\xEF\x60\x5D\x90\xFD\x58\x90\xF5\x62\x14\x0B\x44\xA8\x6F\x20\x02\x3E\x6A\xD5\x87\x64\x17\xBB\x95\x60\x90\x54\x01\x5B\xC1\xA3\x55\x90\x6B\xB6\x4D\xC2\x2E\x8A\x44\xAF\xBD\x4C\x90\x69\x92\x10\x76\x70\xD8\xBE\x46\x6B\xB5\x65\x59\xF0\x10\x1C\xCA\x0B\x87\x92\x28\x67\x94\x68\xB2\x6F\xB7\x4F\x67\x4B\x6B\x41\x47", "\x92\xCF\x89\x0C\x38\x93\x4A\x71\xD8\xBC\x18\x8E\xC2\x48\x5A\x69\xC0\xB2\x8E\xF6\x94\xAA\x71\xAD\x64\x81\x08\xC8\x65\xD2\x8A\x1D\xC8\x14\x91\x65\x4A\x87\x90\x2B\xF5\x92\xC2\x22\x8F\xCE\x8A\xF6\x85\x8D\x21\xA0\xCB\x81\xEB\x1C\xC2\x6B\x65\x6A\x87\xC6\xB3\xA7\xF0\x8C\x5D\x67\x33\xBB\xC1\xA5\xBF\xE9\xBD\x65\x89\xBE\x82\xBF\xE2\xBA\xF9\xB5\xBE\xAF\xBE\x95\x92\xFB\x99\xBE\x03\x6A\xE0\x80\xD4\xAE\x67\xB9\xBC\x06\xCB\xFB\x94\xBE\xAC\x65\xE7\xB7\xFC\xB3\xBE\xAF\xC2\x2D\xC1\xD0\x85\xBF\xBF\xBF\x2F\xC4\x0B\xE0\xBE\xB0\xC3\xF2\xB7\x92\x55\x32\x98\xC0\xE4\x8C\xD3\x5A\x8E\x72\x00\xE7\x8A\x71\x88\x7C\x19\x6A\xC8\xB4\x39\xB3\x0E\xD3\xC3\xAF\x60\x3A\x95\x6E\xA2\x8F\xC4\xA3\x8B\x0D\xC3\xB0\x8E\x7B\xA6\xA5\xAC\x7F\xB6\x8E\x22\xBA\xFB\x9D\x90\x0B\xA1\x44\x5C\x3B\x9F\x2E\xA8\xC0\x06\x9B\xA2\x62\xC3\xFF\xB7\x95\xA2\x88\xAB\x83\x84\xA2\x0A\xAD\x0D\xE0\x83\xA8\xA4\x38\xC6\xDC\xB2\xB4\xBC\xB1\x41\xA4\x10\x88\x72\x57\x91\x99\x6A\xC6\x8B\xC2\x6B\x69\x27\xC1\x00\xD6\xA7\x8E\xB0\x08\x05\xA7\x52\xC1\x92\xB2\x06\x37\xC7\x99\x84\x79\xB3\x56\xA2\xFE\x7C\xC1\x18\xBB\x2E\xB9\xAC\x49\x6A\x5A\xA7\x3F\xC6\x12\xB6\xAF\xA3\xC3\xEE\xB9\x85\x6C\x84\x04\xC7\x4B\x87\x0E\xFA\x91\x05\xC5\x68\x93\x82\x50\xB2\x3C\xC0\xA2\x83\xC9\xB4\xAB\x95\xB0\xAB\x6A\xC7\x89\xC2\xF0\xB6\x4C\xB5\x00\xF5\x8E\xA8\xB0\xEB\x9B\x08\xE9\xC3\xDB\x6A\x2B\xB6\xC1\x51\xB5\x76\x85\x3F\xC7\x48\xBF\xB2\x3B\xC5\x59\xBE\xC7\x97\xC4\x58\x80\x95\xA9\xF4\x53\xB3\x41\xC5\x3E\xBF\x22\xAE\xBB\xE2\xB2\x4F\x68\x9A\x58\xBB\x91\x85\x3A\xBB\xED\xA9\x8A\xDD\xBA\xC0\x69\x19\x9C\x8A\x4A\xC6\x18\xBB\xCF\x8D\x57\x14\xB7\x65\xB6\xD0\xBC\x87\x86\xB6\x46\xB8\xE3\x85\xA6\x3F\xB6\x7A\x81\xD4\x9E\x33\x44\xB7\x6E\x96\xD4\xBA\xC3\xE1\x6E\x4C\xB5\x33\x89\x87\xD4\xB5\x44\x53\xAB\x25\x8E\x31\x89\x18\xCD\x16\xFA\xB3\x28\xAB\x98\x6B\xE1\xB2\x6D\x1D\xBA\x7D\xBC\xE0\x8F\xB7\xB7\xB7\x67\xBE\xF8\xB1\xC5\x89\xB6\x79\xBB\xD8\xB0\xB8\xD9\xB4\x0E\xCB\xE2\x87\xC6\x8D\xB5\x78\xBF\xE1\x8D\xB8\x34\xBA\x6A\xBD\xE4\xA8\xB7\x19\x55\x82\xBE\xD8\xBA\xB6\x30\xC6\x64\xBE\x16\xDD\x70\x18\x88\x89\xB5\x18\xCC\xB9\x0C\xC5\xAB\xB2\x02\x32\x6F\x6A\xBB\x44\xCC\x13\xC6\xB9\xE4\x6F\x8C\x8D\xFF\x7F\x6F\x37\x8A\xFA\x6F\x01\xF7\xB8\x4C\x56\x68\xC4\x1A\xF4\x6F\x57\xC2\x04\xCC\xC7\x4E\x70\x56\xAA\xF7\xB3\xC1\x6A\x14\x82\x70\x21\xCA\x2B\xAB\xBF\x1D\xC5\x07\x9E\xFE\xB1\x8F\xF0\xBE\x23\x7E\x1B\xFA\x71\xFE\xBF\xCC\x83\x9F\xAA\x72\xBA\xC1\x07\x93\x13\xEA\x82\x07\xC3\x2C\x79\x14\xDD\xB9\x13\xC2\x0E\x70\x10\xCC\xB2\x06\x90\x42\xBA\x01\xE4\x90\xD1\x20\x02\xCD\x0E\xD2\xC0\x45\xC4\xCF\xA0\xC5\x5B\x81\x52\x73\x16\x90\x06\xD4\xC4\x57\x6B\xBC\x52\x02\xC0\x01\xDE\x90\x32\x90\x4E\x86\x93\x22\xC2\x0B\x07\x03\x16\x92\x03\x06\x25\x9E\x09\x84\x93\x46\x92\x26\x99\x17\x28\x70\xB7\xBC\x49\xC5\x0A\xD1\x54\xA2\x92\x30\x91\x02\xEB\xA7\x20\x05\x38\x9E\x1E\xE3\x93\x38\x02\x2B\x93\x10\x2E\x92\xF7\xC5\x3A\x99\x1F\xF3\x9D\xB4\x93\x18\x9E\xDD\x45\xA0\x1C\xC4\x07\xB0\xF2\xB9\x9B\xEA\xC2\x1B\x90\x4C\x94\x0F\xA3\x92\xF0\x05\x4A\xB8\xC7\xC3\x09\x25\x81\x1F\xE2\x5D\xE7\x93\x40\x07\x4E\x8D\xC8\x07\xCA\x3A\x92\x4B\x85\x92\xBD\xB3\x14\x80\x7D\x30\x93\xB4\x71\x9E\xB9\x25\xAE\x94\x6F\xBA\x0D\x0B\xD1\x43\x04\x1B\x75\xA6\xB5\x53\xA6\xBA\x34\x8B\x47\x93\xC5\xA7\x6B\xA5\x88\xAE\xBD\x1A\xFD\x04\xDC\x90\x6C\xC0\x55\x80\x95\x52\x97\xAB\xB8\x50\x44\x96\xA5\x94\x1D\x07\x58\xBD\x07\x20\x34\x1D\x0A\xCB\x4C\x02\x27\x04\x95\xC6\x5C\x90\xC9\x93\x97\x4B\x07\x5E\xA5\x01\xAB\x95\x96\xCD\x5A\xB7\xBC\xF0\x96\xD2\xB9\x0D\xD7\xBC\x14\xBF\x81\x97\x66\xAB\x9A\xB1\x9F\xF8\xAD\x24\xCC\xC9\x58\xC8\x46\x3F\x24\xF0\x04\x51\xCB\x16\x76\x25\xC6\x04\x73\xCB\x9C\x7D\x24\xDB\xC9\x5D\xC8\x65\x9C\x11\xE1\xC9\x66\xC9\xA2\xA0\x07\x81\x5A\xB9\x5A\xAA\x9C\xCA\x82\xA9\xBC\x95\x69\x28\x84\xBF\x97\x44\x04\x70\x95\x5E\xAC\x01\xBA\x72\x2A\x07\x12\x0E\xCA\x57\xC8\x4C\x06\x1D\x1B\xC9\xE9\x95\x7D\x3E\x5C\xB7\x66\xD1\x96\xEA\x92\x28\xE4\xC9\x06\x9C\x79\x27\x26\xC0\xAC\x26\xAC\xC4\xA6\xAD\xA1\x97\x92\xC8\xB2\x39\x9F\xBE\x96\x8A\xC8\xA2\xCC\x28\xF6\x00\x90\xCA\x41\x0D\x2A\xF6\xC9\xAA\xC8\xA5\xC8\x9B\x6A\x97\x5D\x6C\x74\x94\xA5\xAF\x97\x37\x5B\xA6\xC6\x13\xC1\xCA\x47\xBF\xC7\x9B\x08\x97\xC8\x80\x9C\xA9\xC3\xA1\xAB\xBC\xFB\xB9\xCB\xB9\x2D\xB6\x00\x30", "\xBC\x00\x02\xF3\x83\x29\x1A\x98\x87\x9B\x27\xD1\x9C\x0F\xBE\xBA\x8B\x18\x2C\x8B\xFC\x85\xEA\xB7\x65\x80\xBD\x10\xBE\xBD\x84\xF4\x93\xB7\x87\xA9\x9F\xCB\xAF\xBF\xC9\x8B\xAA\x98\xC3\xAC\xA6\xC4\x75\x80\x59\x73\x72\xB2\x99\x52\xBF\xD0\x9C\x5E\x55\xBD\x0F\x8F\xD5\xB4\xF5\x9A\xBD\x16\x8C\x89\x2A\xF2\xA8\x34\x9D\xC8\xBF\xB2\x23\x32\xC7\xC9\xCB\xB2\xC7\x2F\x0D\xCB\x36\xBE\x78\xC8\xF3\x99\x54\x12\x9E\xB4\xC6\x40\x10\x9C\x0C\x9D\xB4\xC0\xD5\x51\xBC\x55\x74\xB7\xC5\x26\xF5\x98\x7E\xCB\xC5\xBC\x2B\xFE\xAB\x63\xCB\xC6\xB7\x9D\xB6\x81\x4F\xBC\xC9\x9F\x58\x66\x9C\x7E\x9F\xBB\xC5\x76\xAD\xCB\x46\x98\xD6\xBB\x2E\xF0\xCB\xDB\xA6\x82\x2D\xF5\xA6\x4D\xDD\xA9\xE1\x1B\xA6\xA4\x8E\x96\xA1\xB8\xA8\x81\xBC\x9A\x73\xAB\xAC\xA9\x94\xB7\xA9\xEB\xAA\xB3\x9A\xAB\xB8\x6C\x9A\x9B\x73\x55\x6D\xB0\xCC\xF4\xAA\xDE\xA4\xB4\x79\xAB\xDE\xCA\xC5\xB6\x13\xCB\xCC\xEF\x0B\xA7\xCC\xF4\xA3\x81\x5F\xAA\xFF\x96\xB0\x90\xAB\xF7\x9C\xBD\x9E\xB0\x88\xAC\x49\xCE\x03\xAA\x74\xA1\xA1\x47\xCF\xB4\xAC\x60\x40\xCB\x12\xAC\xAF\x99\xAD\x93\xA0\xA4\x8F\xC9\xCF\x6A\x9B\x71\xE2\xA9\x9C\x7B\x32\xE8\xAA\xC9\x9A\x28\x87\x33\xC1\xAA\x31\xCD\xBB\xA3\x33\xE6\xAB\x7E\xAA\xCD\xC7\xB7\x9E\x9A\x79\xAE\xBD\xAB\x33\xFC\xC9\x0C\xCF\xB7\xCE\x30\xC0\xCD\x9E\xC9\xC3\xC2\x31\xC4\x77\xC6\xA9\xD3\xCE\xA9\x8B\xAC\x50\xCD\xC3\xA6\x10\xC3\xAC\xBD\x9B\xD3\xCC\xA9\xBA\xCD\xC8\xAA\xD4\xC8\x46\xA2\xCA\x6C\x93\xB0\x98\xAD\xB3\xCB\x7C\x75\xA7\xC1\x60\x99\x8B\x29\xC0\x19\x01\xF2\x0C\x98\x19\x98\xF1\x51\x7B\x42\x04\xEE\x5A\x3A\x84\x8B\x35\x1D\xF8\x34\x09\xC6\x02\xC4\x8F\x98\x2C\x7E\x3A\xDF\x7B\x4B\x09\x04\xE9\xC5\x6B\x60\xCE\x76\x2C\x7E\x3C\xEC\x9D\xCA\x1B\x6C\xEA\xC1\x5F\x2A\xCE\x55\x8A\x14\x43\xC4\xB9\x01\x34\x9F\x66\x76\x73\xA9\x5B\x38\x9F\x0C\x08\xF2\x42\x04\x2A\x7C\x77\x9B\x8E\x91\x68\x56\x9E\xC7\xCD\xA4\x59\x9D\xCC\x6B\xD6\x99\x74\x8B\x9D\x77\x75\x99\xA2\x19\xA2\x9D\x0D\x21\xED\xCE\xB2\xB1\x9F\xF5\x73\xCD\x95\xCF\x6F\x59\xBB\xCD\x40\x0D\x3B\xD2\x9D\x1C\xA5\xD0\x94\xD7\x62\xAA\xD6\xA4\xF1\xCA\xD8\x46\xCF\xAF\x19\xB9\xCF\x75\x9D\xC3\x69\x91\x81\x3E\xE5\x07\xCA\xF0\x1D\xAA\xC0\x7F\x2F\x59\xCC\x45\x42\x0D\x3E\xD6\xAF\xDF\x1C\x43\x51\x3A\x4E\xB1\x5F\x29\xD7\x9A\x5B\x99\x29\x6F\x02\xF9\xC7\x2A\xDF\x1F\xEA\xCF\xC4\x1E\x02\x38\x00\xC7\x03\x0A\x41\x40\xD1\xCA\x13\x1E\xFC\xC0\x31\x2F\x01\xD5\x75\xFD\xC9\x26\xD0\x57\xF8\xCC\xD4\x94\x5E\x8D\x20\x53\x91\x94\x42\x9C\x99\x91\x51\x4A\x03\xD0\x2B\xF0\x1F\xC2\x70\x48\x0D\x25\x41\x5E\x0B\xD0\xA9\xAB\x41\xD6\xD0\xE8\xCD\x01\xDC\x9C\x55\xCC\x4D\x85\xD2\x80\x97\x69\x95\x42\xAA\x33\x34\x46\x20\xD0\xDE\x0B\xC8\xA5\x27\x44\xC4\x75\x72\x6E\x9F\x25\x21\x09\x25\x3E\x45\x02\x53\x6D\xD0\xCC\x66\x0C\x14\x15\x25\xD0\x01\xC7\x09\xDD\x41\xCB\xC3\x80\x31\x0D\x15\x06\x37\x10\x4A\x04\x0B\xD1\x3F\xF1\xB4\x68\xB3\x00\x72\xA4\x96\x0B\xFA\xCE\x73\x4D\x78\x68\x37\x54\xA2\xB7\x0D\x86\x5E\x4A\x09\x04\x15\xD0\x3F\xD0\xD0\x23\xD3\xC8\x96\x4B\x85\xB2\xC1\xA2\xFF\xA1\x5D\x55\xCC\x4D\xD0\x86\x4F\x44\xFC\xCF\x81\x9A\x14\xD4\xFD\xA7\x04\xD5\x8D\x08\xD4\x22\x2E\xD0\x34\xD3\x2F\xA6\x42\xE4\x6F\x32\xD0\xC9\xA5\x43\xF4\x01\xBD\x94\x19\xD1\x45\xDF\x1F\xBA\x71\xBA\xB3\x10\x29\xBB\x17\xD2\x08\xD5\x4D\x40\x4A\x3B\xD2\x01\xA0\x8C\xA7\xD0\x5E\xD3\x1F\x3B\x56\x02\x32\x45\xD3\xF7\x15\x55\x99\x73\xA7\x53\x36\x71\x03\x1A\x95\x03\x04\x57\x98\xCD\x62\x73\x22\x6C\xAF\xA6\x4D\x51\x9E\x1C\xC5\x29\xA7\x56\xB9\x92\x5C\xD0\x1F\x92\xB0\x90\xAC\xF8\x71\x42\x73\x57\xBB\xD0\x92\x67\xBD\x96\x8E\x43\x74\x6E\x74\x5F\x98\x57\x87\x74\x03\x77\x63\x6B\xD0\x72\xC5\x0D\x77\xC4\x15\x47\xCD\x20\xFD\xCC\x89\x0B\xC5\x42\x4D\x09\x04\x2E\xD7\x45\xD8\xD0\x23\x57\xAE\x44\xF2\x1C\x92\xB5\x87\xA1\x19\xF2\x15\xB5\x6E\x94\xE2\xC8\x21\xE0\x00\x2D\x3F\x1C\xD3\x4B\xE9\xCF\x65\xD0\x1E\xD7\x03\x20\x02\x27\x04\x34\xD4\x40\xEB\xD1\x19\x66\x43\x15\x32\xA7\xAC\x3B\x38\x4C\x00\xC0\x42\x9D\x66\x6B\x04\xB4\xC9\x77\x92\x37\xBD\x31\xDF\x63\x9E\xD3\xC1\x24\xC3\x85\x7E\xA2\x56\x75\x19\xBC\x4F\x49\xFF\x98\xF0\x48\x93\x52\x74\xAF\xD2\x1F\x72\x8C\x39\x9B\x0F\x30\xE3\xA6\xB7\x03\xD1\x4E\x3B\x52\xD1\x0C\x02\x0A\x27\x04\xFB\xD0\x11\x9B\xEF\x38\xD0\xD5\x50\xA7\x47\x4B\x00\xD3\x83\xD1\x36\x95\x8A\x40\xCF\xE0\x36\x96\x1A\x5A\x6A\x37\xF8\x35\xCC\x86\xA6\x74\xCA\x0A\x7F\xC9", "\xA4\x2B\xC3\x74\xCA\xCC\x81\x3E\xDF\x2F\x36\x86\x9F\x3F\xDF\x7D\x37\xD3\x1A\xD5\x03\x2F\x66\x50\x03\x27\x04\x48\xDE\x4F\xE2\x3B\x00\xD6\x68\x5E\x15\x1C\x92\xE4\x7D\x57\xC7\x6C\x72\x26\x1B\x06\xC5\x6F\xB9\xA6\x0B\x3B\xBA\x5E\xB3\xB0\x66\xBE\xCC\x21\xB4\x46\x65\xAC\xD4\xB7\x84\xB3\x50\x2D\x54\x05\xD4\xC9\xDB\x8E\x9E\x61\xB4\x6D\x97\x3A\xD9\x31\xC9\xCE\x31\x9E\x71\x26\x47\xDE\xBD\x56\x06\xB7\x07\x32\xF9\xD3\x93\x49\x42\x0D\x54\xEF\x9D\xF9\xCF\x11\xD3\x77\x99\x4F\x81\xD0\x6E\x67\xD7\x6E\x75\x27\xAC\xCA\x90\x73\x83\x08\x05\x0B\x5C\x14\x4B\xD8\xCD\x4A\xD4\xB7\xA9\x54\xF8\xD1\x32\x02\x34\xD6\x10\x26\xD5\xC6\x98\x40\xD5\xCE\x51\x9E\xD0\xB0\xF9\x14\x41\x15\x53\x68\x97\xB6\x60\x40\x6D\x4F\x78\x9D\xFC\x42\x28\xAF\xD5\xA7\xB3\x2A\xBC\x29\xE5\xC3\x98\x8E\x8E\x53\x9C\xAF\x93\xBE\x1C\x14\xD8\x54\xD1\xD5\x0D\x23\x52\xD8\x47\xF3\x00\x66\xD7\x40\x08\x56\xEF\x75\x6A\xD6\x58\x98\x49\xE7\x9F\x46\x07\x5B\xD2\x02\x31\xD5\x76\x9E\xF4\x45\x57\xFA\x9D\x5F\x88\x1C\x04\x41\x02\xD2\x35\xC7\xED\x82\xF9\x88\x90\xBA\x8F\x5F\xD1\x7B\x01\xD6\xDF\x1E\x19\x67\xD8\x28\x01\x48\x02\x12\x8D\x83\x67\xD6\xA9\xD5\x92\x5A\xDF\x7E\x03\x2B\x40\x6C\xD4\x40\xD9\x37\xAD\xD4\x19\x01\x59\xB6\x35\x9C\x92\xE9\xBA\x43\xE7\x63\x1E\x73\x69\xD2\x74\x8B\x6C\xEB\xAA\x50\x00\x1B\x17\xCA\x1B\x60\x6B\xDA\x04\xB7\xD6\x03\xD6\xF6\x82\x02\x1C\x49\x6A\x05\x38\x61\xC3\x7E\xD6\x74\x74\x70\xD4\xAF\x84\x08\x1D\x06\x5D\x56\x5C\xC9\x59\xC8\xD5\x3A\x19\x5B\xCC\xD7\x45\x08\x6F\xD3\x97\xBB\x98\xA4\x56\x2A\x80\x5D\xCC\x8C\xD2\xD7\xD1\xA5\x4D\x54\xD7\x73\x01\x54\x74\x06\x2A\xD0\x00\xB7\x0D\xDE\xD8\x29\x13\xB5\xD5\x76\xD3\x40\xAF\x68\xBD\xD7\x7B\xD3\xE2\x21\x5A\xE5\xD6\x66\x67\x06\x01\x28\x1B\x06\x75\xD6\x5F\xE8\xD6\xC7\xD6\x2C\x92\x50\xDA\xD7\xCA\xD4\x78\xDF\x5C\xFF\xD7\xBF\xD6\xCF\x6B\xAE\x89\x01\xFB\xD6\x57\x05\x06\x2A\xD7\xEC\xD4\x42\x53\x89\x9A\x36\x17\xD4\x6E\x33\x46\xD4\xD8\x1E\xD6\x0C\x00\x0B\x2B\x40\x1B\xDB\x6C\xD2\x55\xED\x6E\x24\x01\xE8\x40\x3B\x4A\x97\xFF\x6B\xBA\xA8\x3F\xEC\x86\xAC\x4E\x81\x0F\x3A\x41\x23\x15\xB7\xBA\xA0\x05\x2A\xD8\x1E\xB7\xB3\xCF\x0B\xBA\xD5\x3F\xCF\x01\xA3\x28\xE7\xA2\x34\x35\x49\x33\x47\xEE\xD7\x18\xD8\x2F\xDD\xAF\x61\xD8\x07\xD3\x88\xD8\x5E\xA5\xD8\xF4\xAB\x89\xDD\xF3\xA2\x00\x29\xDA\xEB\x42\x64\xE7\x63\xF9\xD4\x9A\x80\x63\xF6\xBE\x32\xD9\x5E\xDA\xC2\x7C\xAB\x08\xB7\xB8\x94\x28\xF9\xD8\x36\x37\xF7\x1E\xA2\x9D\x76\xB8\x9D\xE8\x99\x22\x9C\xB3\x36\xAA\x45\x08\xA3\xB0\x54\x3B\xAB\xEA\x9E\x59\xEE\x78\x6F\x83\xD0\xC8\xEC\x5F\x7C\xC9\x9D\x7C\x1E\xD2\x55\x8B\x48\xAA\x85\xAC\xDC\x76\x00\x4C\xAA\x40\x0E\xA4\x94\x9F\xD5\x52\xF5\x94\x56\xB5\x91\xDA\x75\x9F\x79\xA5\xB2\x01\x5A\x7F\x77\x7D\xE7\x5D\xA9\x72\x77\x39\xDA\x17\x8A\x76\x61\xA8\x7A\x7F\xC3\x4A\xCF\xED\x77\xB6\x36\x4C\x80\xCE\xF4\x9E\xEE\x24\x69\x50\xDA\xF9\x9C\x0D\x0F\xC9\x81\x04\xFD\x9C\xA5\xD3\xE0\x4E\x81\x38\x97\x34\x9C\x43\xD3\xD9\xE0\xCB\x4D\xCC\xCA\x8C\xA0\x84\xCE\xB4\xAC\x06\x00\x01\x51\xA0\xDC\xA3\x85\x88\xD5\x5D\xA2\x2E\x7D\xD2\x83\x04\x2F\xB7\x1D\xA6\x83\x85\xCD\x64\xA2\x0F\xAB\xC6\x7E\xA8\x1F\xA0\xDC\x10\x84\xA6\x62\xAE\xCC\x58\xAB\x84\xB2\xA1\xB6\x56\x1B\xAD\xD6\x30\xA1\xBF\xDB\x22\xAA\x3C\xF5\xA1\x75\x1E\x2A\xA0\x41\x88\xA2\xD4\x0F\x84\xDD\xD3\x3D\x78\xFA\x74\x1D\x07\x12\x12\xDB\x04\xD1\x57\x38\x27\xFB\x4D\x2D\xA1\xC7\x7C\xBD\x8D\xC9\x90\xAE\x97\xC1\x51\x6E\x75\xBE\x94\x2F\x92\xBE\x83\x7A\xC3\xD9\x52\x3F\x88\xA4\x88\xDD\xAE\x1C\x05\x09\xA9\xDB\x70\xBA\xEF\x56\x24\xBB\x28\xC2\x5D\xBA\xD7\xE7\x8E\xAF\xD2\x10\xF4\xA2\x4D\x2D\x61\xB4\x03\x49\x09\x6F\xC6\x97\xDA\x10\xF6\xAA\x4D\x3A\xA2\x40\x9C\xF0\xC4\x89\x9B\x0D\xAA\x54\xF8\xAE\x13\x23\xDB\x12\x66\x6E\x36\xAA\xA4\x97\xFD\xD8\x5A\x59\xBD\x9C\xC4\xE8\x82\xC0\xDB\x89\xAB\x23\x05\xDF\x15\x28\x70\xEE\xC1\xC3\x35\x91\xAD\x6F\x83\xB0\x40\xA4\x4E\xA9\x8C\xA7\x01\x6D\x61\x34\xA6\x10\x22\xDC\xB5\xA2\x5B\xA9\x3D\xDD\xC3\x5E\xA7\xCC\x91\x96\x89\x18\x7C\xA6\x0B\x85\x96\x8F\xA5\x2E\xA7\x7D\x10\x93\xB3\xA4\x1B\x62\x55\xA3\x90\x84\xA5\x08\xA7\xEC\xCA\x72\xFB\xA5\x0F\xA4\x53\xAC\x92\xB6\xAD\xAB\xAB\x4B\xA4\x98\xBD\xB0\x6B\xA5\x46\xA6\x72\xE5\x62\x74\xA5\x49\x85\x94\x88\x7A\x47\xA6\xDD\x2D\x58\x42\xA6\xF4\xA3\x58\xA0\x91\xB9\x7C\x58\xAD\x39\x50\x75\xF0\xA4\x42\x6C\xCD\xDF\x8F", "\x9F\xDC\x37\xDE\xD5\x7F\x91\x86\xB6\x66\xB3\xD2\xDD\x68\xCE\xDD\x2B\xDD\xD4\xD8\x1F\xB9\x60\x7F\xA4\xD0\xD5\xB4\x82\xDD\x68\xA4\x59\xC4\x73\xF5\xA4\x1F\xDE\xC7\xDD\x8C\xB4\x00\x24\x03\x0A\x45\x77\xFF\xA4\x5C\xDF\xC9\xDC\xB3\x41\xB2\x5B\xA4\xCA\xDA\x73\xDC\xAE\x41\xDE\x58\xA8\x1F\xAE\xDC\x88\xA5\xD9\xD8\x75\xC6\xA6\xEE\x2C\x62\xAB\x75\xC5\xA3\x5D\xDD\x3B\xAC\x9E\x7E\x87\x7C\xDE\x46\xC2\x76\xD3\x7A\xA9\x60\xCF\xD2\x75\xFE\xDC\xF8\xA2\xDA\xD9\xB5\x94\xA4\x43\xDD\x4C\xAF\x76\xD5\x8B\x56\xA6\xDC\xD1\x90\xBA\x72\x97\x03\x49\x05\x7A\xF8\xDD\x8C\xDF\xC9\xD7\x79\x79\x59\x73\xA4\xD8\xDA\x74\xF9\xDC\x46\xB2\x49\xA0\x96\x96\xDE\x67\xDE\x5F\xAE\x94\x86\xDE\x9D\xDD\xD6\xD5\x74\xEE\x53\xAA\xA7\xFA\xA7\xEB\x7B\x7A\xEA\xAF\xC2\x10\x9B\x98\x7B\x38\x03\xFB\xA0\x00\x31\xAF\xAF\xA7\x6D\xA3\x77\xB9\xA6\x7B\xD8\x6F\xA6\x6B\xFE\xA6\xEC\x78\xB1\x70\xC1\x63\xA6\xC3\xA4\x00\xBC\x71\x11\x1E\xA8\xDA\xA1\xC5\xA0\xBB\x2C\x81\x9B\xF6\xDF\x66\x41\xA8\x02\x07\x80\xAA\x9F\xBA\x0E\x96\x2C\x13\x62\xA1\x92\x9E\xD9\x75\x10\xA8\x5A\x4E\xA8\x4C\xA0\x84\xAA\x88\x52\xA8\xFC\x9B\x6B\x1A\x43\xA9\x65\x7F\x75\x5A\x6F\x66\x5A\xA8\x00\x00\x87\xAF\x78\x9E\xA8\x8F\xD7\x82\xA1\x68\xDA\xD2\xF6\x55\x89\xAD\xFE\x9A\x9E\x98\x75\x5A\x6B\x42\x1B\xD9\x8C\x04\xE8\x9C\x18\x2F\x59\x5B\xB9\x98\xD0\x59\xB9\x76\xA8\x9E\x6E\xAC\xAB\xA6\xD9\xE6\xC1\xEB\x99\x66\xF7\xCD\xC7\x9E\x71\x74\x95\x1A\xDC\xF2\xDC\xA5\x51\x67\xCB\x2A\x4F\xAA\x8C\x1F\x66\x75\xD9\x01\x07\x9D\xD0\xA5\x95\x9F\x96\x7A\x04\xE7\xBF\x92\x93\xB4\x8D\x9F\xDC\xAC\x7F\xD9\xDE\x75\xF8\x93\x68\xE3\x9F\x85\xDB\x97\xA0\x59\xDE\x26\x77\x32\x98\xA9\xDE\x4C\xDA\x94\xDF\xC8\xC8\x1F\x6F\xAC\x59\xCE\x58\xD8\x32\xF3\x00\x5D\xCC\x26\xAF\x35\xE4\xAB\xA9\xAA\xB2\x9B\x36\xF7\xAA\x65\xCD\xD7\xA7\x36\xFD\xA9\xD3\x9A\xDA\xC1\x74\xF8\xCC\xE6\xD5\xBD\xA9\xAB\xB7\xAB\xB6\x66\x29\xB4\x37\xF2\x97\x48\xBE\xBF\x8D\x2B\xE3\x9B\x79\xCF\xFF\x9B\x37\xC2\xCE\xCA\xAA\xD2\xCF\x37\xC9\xAC\x04\xAD\xDF\xCB\xAC\x8E\xAC\xD4\xA9\x56\xD4\x54\xD6\xCD\xB4\x9C\xA1\x1A\x4C\x61\xAD\x30\xAB\xCB\xA0\x1E\x2D\x61\x50\x03\x0A\x49\x87\xE5\x78\xE0\x05\xCE\xA8\x3C\x28\xDF\xB6\x5E\xAC\xD3\x94\x6D\xB0\x42\xAE\xCE\xAA\x79\xD6\xDD\x46\xAF\x53\x56\x53\x09\x7F\x03\xCD\x0C\xBD\x87\xDF\x95\x99\xA6\x0A\xEF\xB6\x9A\xA0\x71\xAF\xB1\x5C\xC3\xA9\x8D\x75\xAC\xCC\xD3\x85\xE4\xCD\xF4\xAA\xCC\xC0\x6D\xB4\xA0\x38\xAC\x24\xE5\xB7\xA4\x8B\x5E\x50\x2D\x53\x89\xD6\xA1\x95\xE1\xF2\xA3\xB7\xAF\x54\x99\xE3\xCB\xCC\x89\xD5\xE1\x3A\xCF\xD7\xAB\xD9\x74\xE1\x3C\x7E\x1D\xE8\x3C\x17\x74\x42\xB9\x40\x07\xB6\x95\xA1\x6A\xAC\x6A\xA0\x88\xEE\xAD\x82\xE1\xB0\x56\x89\xCA\xAF\xAC\xE2\x2F\xE7\x88\xC9\xB4\x89\xE3\x91\x5E\x36\xEB\xB9\x4C\x7F\xE4\xAD\x06\x3E\xAD\x23\x09\x1B\x63\xB8\x86\x04\xD3\xE3\x34\x65\xB8\xB9\x76\x87\xAE\x0A\xE7\xA5\x8E\xE3\x8E\xAF\xF0\xAF\xB6\x26\x62\xBA\xAE\xED\xA8\xB9\xAE\xDF\x1B\x83\xE6\xAB\x90\xA1\x7D\x97\xE2\xC3\x60\xBA\xA1\x7F\x7C\xAF\x88\x00\x8D\xED\x01\x17\x76\xEA\xA6\x10\x32\xE3\xD6\xE0\xEB\xA5\x8E\x6E\xAE\x0E\x4D\x1B\x0F\x8B\xF3\xAE\xC0\xAD\xED\xAE\x8D\xD2\xAE\xE1\xE3\x3F\xE6\x68\x7F\xAE\x94\xAE\xF0\xA7\xB9\xBD\xAE\xC5\xAD\x39\xE1\x28\x00\xDE\x4C\x57\x25\xE1\x2D\x17\x0E\xCD\xAC\xCC\x5F\xBC\x95\x8B\xD1\xAE\x0C\x05\xBD\x83\x04\xD5\xAE\x9D\xCD\x70\xC1\xD4\x0F\xDC\xDB\xB7\x50\xDE\x79\x03\xDF\xD5\xB6\x70\xD7\x0A\x09\xE4\xC6\xD1\xDB\x06\x3C\xC6\x90\x71\xA9\xBE\x8D\xA6\xD6\xDC\xAC\x72\x03\x06\xDF\xC8\xDE\xEF\xD7\x9A\xB4\x7B\xF4\xAE\x31\xEE\x91\xFB\xA2\x9C\xA7\xBA\x7A\xFF\x7C\xAF\xD3\xDF\x9A\xD5\x9A\xB2\xE4\xAC\xA5\xDD\x21\x5F\x17\x78\x07\xB0\xF7\xD4\x85\x85\xE5\x6F\x58\x03\xB3\x10\x0C\xB0\xB5\xA2\x03\xB3\x52\x50\xB0\x66\x87\x04\xBD\x32\x2B\x16\xE5\xC8\xF9\x78\xC1\x8B\xC2\x1B\xB1\x2E\x9D\x95\x9E\xB0\x13\xA0\x53\x37\xEA\x62\xB0\x91\xCF\xFD\x22\x7C\x72\xB0\xEB\x23\x9D\xBD\x83\x7D\xDA\x32\x09\x10\x68\x96\xCA\x05\x6D\x60\x73\xAB\x7A\x01\x82\x6B\xE7\xC1\x96\x8A\x45\xE5\xA0\xA0\xBE\x37\x84\xA4\xE5\x04\xDE\x04\xBC\xD4\x37\x56\xA6\xE2\xE6\xCB\x42\x38\x37\x86\x7B\xEC\xC5\xC4\x8C\xDD\x47\xB2\x0C\x09\xC4\xBD\x20\x4B\xB3\xEC\xCD\xC4\x9A\xE3\x00\xE3\xE4\x90\x57\xF0\xD0\x72\x65\x15\xB0\x94\xB0\xC0\xF6\xBC\x1B\x65\xF1\x5D\xB1\x03\x07\x17\xB2\x14\xD6\xC4\xD6\x68\x46\xCE\x0F\xE2\xA4\xD7\xC4\x29\xC6\xC8\x89\x84", "\x07\xC6\x41\xC6\x01\xC4\xAB\xAA\x83\x42\xC1\xC9\xB8\x84\x55\xE3\x14\x08\xC7\x9B\x84\x7A\xB2\x5D\xC1\xC6\x8D\xB3\xD4\x51\x3F\xC1\x92\x8C\x66\x32\x8B\xD6\x64\xC8\x85\xD4\xE9\x64\x48\xCD\xFE\xA2\xC4\xCD\xC4\x49\xCD\xC8\xB1\x70\xAA\xE5\x4A\xC5\xC7\x8E\xC4\x94\xB2\xAA\x66\xC9\xA4\x01\x98\xB0\x57\xB0\xFD\x8C\xC0\x42\x85\x0D\x03\x1D\x95\x87\xF8\xB1\x97\xB6\xD6\x9A\xB8\xF3\xB4\x87\xB3\x16\xE0\x87\x7E\xC6\x78\xB4\x90\xA1\xB8\xFD\xB4\x61\xCB\x18\xEB\xB6\x88\xC4\x6A\xBF\xE0\x9C\xB7\xAC\xB7\x76\xE0\xDE\x8B\xB8\xDE\xE7\xDE\xD9\xE2\x86\xB8\x10\xBA\x91\xC5\x4E\x56\xC6\x08\x89\x4C\xD9\x02\x21\xBB\xE3\xB9\x32\x57\x3F\x96\x5B\x32\x02\x1E\xDE\xC7\x0A\xBB\x1F\x85\xBB\xB9\x40\x94\xBB\x16\x5D\xBC\xB6\xCE\x82\x94\x52\xC4\x43\xC7\x50\xAE\x05\xA2\xAE\x8C\xC1\x03\x2F\x82\xD6\x59\xE4\xC1\x7C\x49\x67\xCB\xBA\x92\x8C\x52\xB0\x01\x32\x02\x4B\x92\x03\x3A\x77\x0C\x03\x0A\x4D\xA1\xE1\x71\x32\x03\xEA\xCE\x16\x31\x00\x58\x89\x88\xE1\xD3\xB2\x00\xD3\xBB\xBB\xBB\x69\x94\x62\x02\xEA\xBC\xB0\x20\xF4\xBB\xAB\xE4\x4A\x9D\x04\x2A\x06\x58\xC5\x46\x06\xA2\xF4\x68\x28\xE8\x53\xC2\x65\x6F\x00\x99\x69\x8B\xE7\xA0\xE3\x94\x09\xE9\x8C\xEF\x54\x44\x01\x6B\x61\x8D\xE8\xA1\xDF\x84\x39\xEB\x80\xEA\xA2\xE5\x00\x3D\xE8\xBA\x6F\xA3\xD9\xBB\xA0\xB8\x55\xC8\x28\xB2\xE8\x6F\x0E\xDF\x71\xEE\x99\xE8\xE4\xBB\x86\xE4\x03\x3A\x03\x27\x04\x97\xE0\xA2\xC8\xE9\x29\xEA\x38\xB4\xEB\x83\xBB\x4E\xEB\x99\x20\xA5\xD4\x86\x54\x71\xBC\x62\xA3\xF4\xE8\x1B\x96\x8D\xE0\xA6\xFA\xE8\xD5\x50\x8F\xEC\xEE\xA5\xE9\xE7\xB3\xBC\xB1\xA5\xC7\x64\x6A\xEB\x90\xE5\xA4\xED\xE9\x47\xEB\x89\xE1\xA6\xD2\x59\x4C\xEB\x9C\xE5\xCE\xA6\xE9\x76\xE8\x9A\xE8\xA7\xF6\xBB\x22\x02\xE3\x09\xEF\x84\xCB\x31\x76\xB1\xC3\x61\xB4\x00\xF9\xC8\x06\xA2\xF0\x92\x99\x3D\x74\x98\xC0\x2D\xD8\xCB\x02\xCD\x4F\xD8\xB3\x56\xCB\x01\xCF\xC1\xCA\x2D\xC9\xCC\x85\xAA\xD1\xB0\x31\xE3\xCB\x49\xBD\xCF\xCA\xF1\x8A\x82\xF2\x7E\xD3\xB7\x2E\xDF\xBC\x6E\xE0\x92\x92\xF2\xAA\x9C\xEE\xC9\xC8\xBA\x64\x9B\xBD\x2B\x13\xE3\xC0\x31\xD3\x74\x9E\x96\x7E\x77\x23\xE9\x30\x81\x81\x83\x9D\x89\xB7\x79\x9F\xA3\x6C\x5B\xE7\x76\x56\x37\xE5\x63\xEB\xF5\xB6\x27\x1C\x7A\xDA\xB2\xF6\xBD\x8C\x6A\x73\x9B\x58\xF6\x83\x04\x68\xBF\x2D\x5A\xF6\xA3\x64\x37\xBF\xE5\x98\xD0\xB8\x63\x71\xBC\xB3\xEE\x53\x2D\xC7\x46\xC0\x15\x12\x22\xC4\xC8\x6E\x03\x60\x8A\x20\xC2\x04\x0C\xCB\x09\xC0\x0A\xB2\x92\x11\xC9\x94\x04\x46\xB5\x5E\x37\xE6\x85\xCD\xAA\xC1\xCB\x95\x56\x86\xC1\xBB\x16\x0B\x6C\xC8\x9C\xCE\x25\xEF\xC9\x65\x01\x9C\xC7\x03\x33\xC9\x03\x05\x9D\xC1\x42\xD1\xC9\x78\xC8\x6B\x9A\x8B\xB0\xCD\x41\xCE\xDD\xC7\x66\xE1\xCB\xA6\xEB\xD2\xB8\x81\xC1\xA9\x38\xD9\x9B\xCF\x12\x2F\xD9\xF4\xC8\xCB\xB6\xA1\xB3\x74\x38\x01\xA4\xE8\xD3\x73\xBC\x51\x99\xFA\x55\xF0\x89\xAE\x55\x99\xC1\xC8\xA9\xE3\x98\xD3\xC8\xC1\xCF\xF3\xA8\x8B\x60\x9A\xD0\xB3\x66\x8A\xCC\x9D\xC8\x17\xE3\x7C\x81\xAB\xA3\xEB\x8D\x99\xAA\xD7\xB5\xF4\x7D\xC5\xC8\x2E\xD4\xCD\x2D\x9F\xAB\xE6\xF5\x9D\xCC\xEF\xCB\xAC\xE1\x2F\xFF\x99\x91\x1E\xB6\xA1\x84\xEB\x48\x25\xCF\xC6\xA7\x03\x2E\xA9\x03\x04\x9C\xA1\xB4\xE2\xAC\xE5\xA8\x14\xE2\xAF\x96\x9B\x4D\xE3\x3D\x3F\x84\xEE\xCC\x7F\xAB\x26\xE8\xB7\xB9\xCC\xCB\xE2\xB6\x94\xB0\xF5\xCD\x72\xCD\x8D\xDA\x2B\xE8\xEA\x89\x61\x07\xAE\xCF\x68\xE1\x81\xCC\xC3\xAB\x86\xE7\xE1\xA5\xDA\xC2\xA4\x86\xE0\xED\xB5\x99\x1B\xE6\x4C\xF0\xEB\x70\xE0\xC6\x8A\x50\x6C\xCC\x49\xEE\xCB\xC3\x36\xD3\xED\xAD\xE6\xD9\xC8\x85\xF4\xCC\x69\xCF\xD2\xE4\x85\xE7\x5E\x55\xEF\x74\xBC\x33\xF1\xCD\x3E\xCF\xC1\xE8\xF1\x89\xEC\x11\xCC\xD7\xE5\xAC\xB8\xA0\x9A\xDB\xD9\xE5\xB6\xD5\x78\x3B\xA3\xD7\xEB\xB8\xE1\xED\x6A\xE2\x19\xEF\xB0\xA7\x9C\x6F\xE3\xBE\x95\x77\x17\xCE\x01\x05\xE6\xC1\x97\xD6\x66\x7A\x97\x49\x08\x0D\x54\x5A\x9B\xEE\xE8\xC1\x39\xF1\x42\x09\x04\xE9\xEC\x02\xF7\x52\xA1\xED\x3E\x77\xE7\x9C\x78\x2B\x11\xA1\x9B\x42\x3A\x77\x8E\x03\x49\x01\xBB\xDA\x5A\x2B\x12\x9D\x72\x05\x41\xEB\xDA\x53\xB0\xE1\x88\xD6\x9A\x7F\xE5\x3E\x7B\xB1\x75\xEE\xBF\xEB\xED\xE9\xB7\x35\xE5\x47\x32\xA1\x53\x6F\x69\xEE\x94\x34\x7B\xCE\x9D\x9B\xEE\x6A\xE7\x10\xA8\xB9\x3A\x77\xB9\x03\x49\x01\xBD\xDA\x5A\x9B\xEE\xED\xE4\x97\xC2\xEB\xA1\xA2\x6D\x53\x6F\x7C\xEE\x9C\xCE\xEF\xE2\x53\x55\xEF\xC1\xEF\xF5\xE9\xBB\xD9\xEF\x9C\x5C\x5E\xE7\xF5\x8E\x31\x04\xDE\x30\xA8\xBC\xC0\x2A\x40\x00", "\x61\x99\x50\xD4\x05\x68\x7B\xFB\xEE\x7A\x74\x00\xA6\xCF\x40\x06\x3A\xF3\x79\xF2\xED\xA9\xB7\x8E\x5D\xD2\xE4\x6D\xAB\x9B\xB6\xD2\xAC\xD9\x35\x2E\x1E\x3C\xF2\xE1\x93\xD9\x3D\x75\x68\xB8\x9C\x91\xCF\x9B\x22\x7C\x52\x9D\xC4\x5F\x22\xDA\xCD\x66\x01\xFF\xCC\x24\xD2\x10\x12\xD2\x5E\x96\xE2\x6B\xFD\x87\x78\x97\xD3\x60\x5D\x7C\xEF\xA7\x71\xD4\xFF\xE9\xA2\xA2\xD3\x7E\x9D\x28\xDC\xBE\xDE\x77\xFC\x71\x5D\x97\xB2\xA7\xD2\x7A\x95\x2A\xD6\x06\x3D\x95\x08\x77\x5F\x9E\x4A\xC1\x96\xB1\xD3\x05\x28\x43\x58\x73\x57\x96\x23\xD3\x03\x12\xF0\x01\x04\x05\xF6\x06\x14\xD2\xE4\x72\x63\xDA\xC1\xF7\xBC\xC6\xEB\x64\xDC\x49\xFC\xE6\x41\xD5\xBA\xC4\x4D\x62\xF0\x11\x04\x09\xF6\x05\xD8\xCC\xDD\x94\x0A\xF9\xD0\x6A\xF0\x2C\xF1\x2B\xDC\x60\x4C\x74\xDE\x08\x10\x0F\xD0\x78\xD3\xDF\x1E\x81\xC1\x16\x39\xD3\x33\x00\x1D\x0B\x02\x5E\xF1\x23\xD5\x5C\x15\x52\xC3\xD8\xDF\xD1\x70\xCE\x1F\xD8\x91\x1F\xE7\x4B\x42\xBF\xCB\xD4\x5A\x19\x43\xD3\x3C\xD9\x90\xC3\xD7\x7A\x98\xB8\xD0\xAC\x13\xD6\x5E\x95\x51\xF1\x37\xCD\xCD\x1C\x94\x52\xD2\xD5\x26\xD7\x60\x55\x46\x94\xA9\x2A\xD6\xD5\x58\x53\xEE\xD4\x16\xA7\x3A\xEC\x1A\xA2\xC2\xCF\x4B\xC1\xDD\x88\xEB\xD4\xB3\x24\x21\xFD\x97\xBB\xD4\x8D\xE2\x59\xCF\x53\xC2\xB5\xB7\x85\x8E\x64\xB3\xCD\x57\x4D\x90\x8F\x08\x9B\x30\x1F\x56\xF0\x3D\xD8\xC5\xCD\x20\x5A\xF0\x1B\x09\x4F\xF7\x00\xFD\xD2\x41\x05\xCA\xE8\xC8\x5B\xF0\x1F\xF4\xC6\xFF\xBF\x66\xF3\x35\x93\x1C\xF2\xC3\x5E\x7B\x1A\xF2\xC1\xAD\xF1\xF9\x72\x43\xD0\xC7\xF0\x4A\x11\xD4\x1D\xF6\x29\xF7\x37\x76\xF3\x48\xA8\x71\x78\xF1\xCC\xD1\x9A\xA4\x58\xF0\x1F\x86\xD6\x47\xD4\x03\x2E\x8E\x06\x04\x32\xF9\x56\xFC\xF1\xAC\x4D\x57\xDD\xCF\x60\x8E\x58\xD7\xFF\xEC\xAF\x5B\xD5\x39\x06\x33\xF5\xC5\xE7\xAA\x8D\xD5\x06\xF5\xDE\x51\xD6\x28\x74\x65\xD3\x57\xF7\x9D\x17\x40\xFC\x48\x59\xE1\x94\x78\xD5\x95\xD1\x6A\xE6\xF3\x4C\xBE\x68\xDD\x7D\x03\x20\xDF\x1D\xFB\xE4\x76\xA3\xBC\x3E\x04\xDA\x90\xAB\xF2\x01\x6F\x5A\xDB\x93\x10\x2E\x9D\xC6\x9B\xCD\xE2\x77\x88\xD9\x75\x9F\x37\xF6\x59\xE1\xF3\x79\x9E\x16\xCF\xC4\x61\x66\xEF\xE9\xD5\xC3\xCF\xD5\xF1\xA6\xD7\x7F\xD9\x4B\x2B\xD6\x0A\xF6\x96\x1F\x3F\xE7\x02\x27\x04\x44\xF3\x5B\xF9\xEF\x3B\xC8\xB9\x7E\x2F\xEC\x7F\xA7\xD6\xCA\xE4\x65\xE1\xD0\xD9\x36\x46\xF3\x28\xFE\xEF\x94\xEF\x31\xD7\x5A\xC2\xF0\xCB\xD3\xC4\x15\x4B\xCB\xE0\x31\x03\x23\x08\xF5\x2A\xF4\xD3\xD3\x8D\xA1\x3B\xE9\x91\x1B\x6D\x49\xD3\x3F\xE6\x85\xF5\xCE\x17\xDD\x40\xED\xF3\x3C\xDA\x8F\xD7\xA1\xAE\x71\x2F\x8E\x1B\x7B\x4D\x7D\x3A\x38\xF7\x03\xDE\x63\xDA\x7F\x12\xD2\x17\xD1\x19\x33\x6F\xD7\xF2\x50\xFE\x47\xCB\xD7\x1A\xD1\x73\xDC\x5B\xFF\xD5\x16\x06\x53\xF9\xD4\xFD\xD1\xD4\xD3\x1F\xD4\x42\xF3\xD8\x49\xD0\x21\xD9\x42\xE0\xD1\x41\xF4\x55\xFE\xD2\xD9\x90\x2F\xD3\x00\xEA\xBF\x71\xD1\x75\x4B\x54\xFA\x46\xDF\xF5\xBA\xD4\x20\x3F\x69\xE2\xE6\x5D\xD1\x0A\xDB\x5B\xC2\xD1\x44\xD2\xB2\x0D\xD5\xE7\xF5\x62\xD9\xEC\xC7\x31\x31\xF4\x7C\xF2\x2F\xDD\x75\x6D\xF2\x27\xA8\xCA\x34\x95\x56\xF2\x05\xF5\xCA\xA8\x4C\xF9\x15\x66\xF5\x49\xDA\x2D\x42\xD5\xDD\x95\x36\xDD\xE3\x34\x75\xDD\xD0\xB9\x4B\xC3\x78\x92\x46\xF1\x42\xB4\x2E\x6F\xD3\xDE\x75\x3B\xDB\x83\x66\xD2\xE9\xD2\x3B\xD4\xD7\x70\xD3\x1D\x39\x61\xF2\x55\xDE\xF0\xB6\x6A\xEC\x92\x4F\x1E\xF6\x58\xD1\x20\xEF\xC9\xDC\xF2\x39\xF6\x1F\xDE\xB3\x83\xF3\x84\x5D\x6A\xF5\xD5\xDB\xEF\xB5\x11\x3B\xF5\xD2\xE4\x08\xF8\xEA\x2D\xD2\x76\x49\xD6\x02\x07\x62\xD6\xD8\xD6\xD3\x91\xF6\x62\xFB\x4D\xED\xF3\xDE\x74\x39\xDF\xD8\xE1\xD3\x88\xF4\x1B\xF9\x4E\x14\xF6\x66\x6A\x65\xF5\xDC\xE0\xB3\x6B\x05\xBC\x44\xD9\xE5\x59\xF2\xD0\xFC\x13\xDB\xCC\x06\xB5\xF4\x4A\xF7\x19\x7F\x44\x5E\xF5\x5D\xF5\x4D\x73\xF4\x32\x65\x4D\xF2\xA4\xB7\xF4\x79\xF2\x52\xF5\xD5\xFB\xF4\x28\x8D\x4F\xF8\x32\xBF\xF4\x69\x64\x69\xF3\xD4\xD0\x49\x22\x8A\x90\xA7\xD4\xD3\x06\xEA\xF7\x52\xFC\x5D\xCE\xD7\x42\xA8\x8E\x0F\x41\xF3\xF5\x25\xD6\x81\xD2\x65\xEC\xF5\x5A\xF6\x6E\x9C\x5E\xF1\xF7\x55\xF7\x04\xC1\xD6\xE0\xF6\x55\xB4\x59\xF4\x43\xC0\xF8\x68\xF4\x20\xD7\x8E\x7B\xF7\x1E\xC5\x64\xE5\x48\xEF\xF5\xF8\x67\x10\xD3\xC8\x21\xF7\xD9\xF7\x03\xE5\x4D\x7A\xF5\xBC\xD5\x06\xBE\xE0\x7E\xF5\x45\xF3\x25\xF3\xAA\x91\x54\xC9\xD0\x82\xFA\xDD\xFB\x71\xBC\xF7\xBD\x9E\xDB\xF4\x0A\xDC\xD0\x5E\x5E\xD8\xE0\xD3\xFE\xC8\x08\xFD\x5D\xA4\xD3\xC8\xF5\x94\x99\xD9\xD7\xF6\x27\xF3\x8C\xFF", "\xDC\xC9\x6F\xD1\xF5\x6B\xF2\xDE\xDF\xF5\x04\xFB\x02\x92\xDA\xD5\x1A\x55\xF3\x74\xF6\x43\xD0\xA2\x78\xD1\xF9\x88\xDB\xC1\x04\xBA\xF4\x1F\xF7\xD8\xFD\xF6\x3B\x06\x36\xD8\xE2\xCC\xF6\x2A\xFA\x76\xDC\xE2\xDC\xEC\x92\x6A\x8B\xF6\xDC\xF7\xD7\xFC\x69\x5A\x99\xDC\xF3\xF8\xCB\xF7\x80\xED\xDC\xDA\xF6\xE6\xD0\xD4\x69\xE3\xE4\x08\x25\xF6\x75\x0D\x3F\xD6\x07\xF2\xC5\xAB\xC3\x10\x2F\xCA\x21\xD3\xA4\xC2\x60\xD5\x06\x95\xC9\x1C\xF5\x2B\xF6\xAF\xB8\xCA\xA8\xE2\x2E\xDD\xE1\x2C\xEF\x9D\xFE\x2B\xC4\x77\x1E\xF8\x78\x9B\x5B\x8B\xCA\x4E\xDE\xCF\xEF\x6A\x9A\xCD\x87\x98\x0E\x05\x84\xC2\x04\x5D\xCD\x9C\xA3\x8B\x2D\xCC\xEF\xC2\xD8\xCB\x84\xEA\xAB\x9D\xE2\xDD\xEF\xAE\x91\xE1\x7A\xEF\x2B\xEC\xB7\xD7\xE1\x6F\xCD\xAE\xCF\x85\xE7\xF3\x29\xEE\xD0\xCB\xB0\xCF\xAA\x88\xEC\xDA\xE8\x34\xE2\xE1\x85\xCF\xD2\xCD\xAC\xA2\xFA\x7C\xCF\xE0\xC4\xEA\xE6\xDA\xBF\x99\x60\xF8\xC9\xCA\xCE\xA0\x21\xB2\xDD\x4B\x6B\xAC\x5E\x05\xC6\xAC\x8B\x3B\x08\x6F\x5B\xC7\xA3\x10\x1F\xAC\xB7\x50\xAD\xF2\x07\x2C\xD1\x43\xD9\x9F\xF0\x5D\x7E\xFA\x33\x9D\xCD\x91\x3D\xF8\xCE\xD3\xCC\x0D\x05\x3D\xC0\x00\xD7\xCE\xCF\x99\x3D\xC2\xDC\x0C\x8C\xF7\xCF\xC6\xC6\x9D\x79\x04\xD2\x9F\x6A\x0B\x79\x0B\xD2\xF2\xC5\x3E\xCA\xD2\x33\xF3\xC5\x0F\xC0\xEF\x59\x38\xF0\x00\x0A\xC3\xFC\xF0\xEC\xBF\x5A\xDF\xC3\xFE\xCB\x41\xF1\x07\xF4\xC4\xC4\xD3\x5D\xF8\x12\xFA\xCF\x7F\x9E\x4B\xF1\x64\xFE\xC4\xFF\x95\x50\xF3\x2A\xDE\x57\x89\xF1\x2F\xF0\x15\xF1\xCD\x0E\xD1\x74\xF4\x1D\x07\xD2\xD6\x04\xB0\x5A\x2E\xD3\x10\x3A\xD2\x15\xF8\x43\x58\xE1\xFC\xC7\x08\xB4\x87\xFC\xEE\xD1\xF6\xA3\xCB\x60\xF4\xF2\x1D\x3C\x9E\xF1\x47\xD0\x7F\x1C\xD4\x7B\xF2\x47\xD3\x03\x25\xF2\x03\x07\x29\xF5\x4F\xEA\xF2\xB8\xD5\x05\xCF\x46\xDF\xF0\xA4\x54\xF7\xA2\xCB\xD2\xF6\xF7\xF9\x65\x3F\xC6\xD3\xC0\x72\xF9\x2E\xFF\x63\xB5\xF1\x09\x77\x1D\xFD\xDF\x33\xD3\x18\xD5\x5F\x72\xF1\xD3\x1C\x14\xFE\x18\xF8\x47\xF4\x00\x22\xD6\x41\x09\xF3\xE8\xF2\xA2\xF0\x1F\xF6\x06\x27\xD4\xEC\xBD\x4A\xD5\xD3\xB7\xD4\x8D\xF0\x55\x6F\x52\xE1\xAE\x47\xD8\x22\xF5\x53\xFC\xD4\x44\xFD\x4B\xD6\xF4\xC9\x81\x90\xF1\x4F\xD2\xB1\x53\xF2\x68\xC5\x87\xFE\xEA\xDF\xF8\x45\xD6\x26\xF8\xE5\xCC\x06\x3E\xED\x58\xD0\xB4\xE3\xD5\x1E\xD5\x0D\x07\xE4\xC0\x00\x8B\xD4\xD8\xFE\x63\xE6\xFB\xDB\xF1\xF9\x19\x63\x2D\xBD\x0C\x59\x65\xD8\x01\x57\xD6\x02\xF4\x39\xFB\x51\x4C\xF8\xE8\xC0\xA7\xFC\x57\xC8\xC4\x5E\xD3\x8B\xC4\x5A\xCD\x20\x09\xF6\x66\x36\xD7\x35\xD6\x0C\xF6\xDF\xF7\x4B\x35\xD6\x6F\x59\x29\x0B\x02\x46\xFE\x13\xF7\xE0\xF1\x60\xF3\x9D\xAB\xF0\xC2\xF9\xD6\xE4\xD2\xF5\xD6\xE0\xF7\xDC\xD1\xD7\x0A\xD8\xBD\xA2\x5C\xF8\xF2\xAE\x6B\x75\xD6\x5B\xC2\xD8\x1D\xFE\x2F\x8C\xD4\xD1\xF5\xDD\xD5\x78\xDA\x26\xD2\xFE\x5B\xFC\x77\x5D\x64\xE7\xD7\x7F\xE1\xE6\xFF\x5F\xF1\xD7\x9C\xFF\x40\xDC\xFE\x9F\xFE\x1B\xD2\x5C\xA4\x5A\x46\xD8\x91\xFE\x98\x00\xCC\xF8\xD7\x95\xFD\x15\xE8\x5E\xD0\xD8\x57\xF5\x71\xDB\xFA\xCB\xFE\x48\xD9\xE3\xFF\xFA\xF4\xFE\xE2\xD4\x82\xD4\xF9\xDE\x87\x0B\xD9\x83\xDB\x11\x3C\xFE\x5A\xD2\x3B\x5D\xF7\xF6\xFE\x8A\xFD\x92\x51\xF8\xD0\xFF\xF0\xD6\x12\x8D\x86\x72\xD6\x06\x04\xF6\xFD\x47\xF4\xD6\xC0\xFC\xDE\x4D\xF9\xD2\x61\x0A\xF9\xC7\x75\xFC\xE4\xFE\xE5\xD2\xC4\x87\xFA\xE2\x00\x97\xFC\x71\xD9\xDA\xDC\xFF\xD8\xD5\xEB\xF2\xE5\xF6\x91\xF3\xF4\x07\xD7\x60\xE4\xFF\x09\xD8\xF2\xF3\x5D\xE9\xFE\xBE\xFC\xF9\xFC\xFA\xCC\xFE\xDF\xFD\x47\xAD\xD4\xE1\xFE\x8F\x6E\xF0\x6B\x2B\x3C\xDC\x64\xFD\x65\xFD\x6C\x57\x67\x7F\xBB\x7F\xBC\x01\x84\x6A\xF5\x7A\xFF\x7D\xFE\x42\xFF\x1E\x7F\xE3\x7F\x02\x81\xF9\x78\xF7\x76\xFF\x75\xC2\x4C\xD8\x7C\x6B\x98\x5C\x8E\x7B\xDF\x7E\x01\x8D\xFF\x76\xEA\x5A\xD1\x03\x80\xFE\x4A\x09\x81\xFD\x79\xBD\x59\xFC\x78\x00\x8C\xFF\x4F\x19\x12\x6D\x8D\x46\x2A\x0D\xC2\x66\x34\x0A\xA6\x2B\x00\xC6\x79\xD7\x01\x93\x01\x0C\x86\xC3\x65\xDA\x60\xB1\x62\xD8\x2C\x6C\x44\x6D\x2A\x72\x91\x69\xA0\x59\x64\x6B\xB1\x70\xF9\x39\x80\x8A\x5D\x27\x6E\x55\x3F\x26\x74\x0E\x7D\xAC\x55\xE0\x22\x6D\x6A\x6C\x2F\x69\x4B\x1E\xA4\x1A\x65\x7E\x3C\x4D\x16\x05\x4D\x9F\x3B\x04\x7B\x1F\x10\x49\x45\xDA\x36\x9C\x67\x04\x19\x67\xDC\x77\xC8\x0D\xE7\x65\x30\x1F\x44\x6F\x55\x7D\xEE\x14\x1B\xFA\x3B\x4E\x03\x0A\x22\x0C\x8E\x58\x5E\x02\x9D\xEF\x14\x1B\xAB\x67\xED\x6D\x4C\x7E\x0C\x8A\x05\x8A\xDD\x71\xCE\x31\x1D\x6B\x81\xF0\x2B\x17\x80\x50\x12\xA2\x6D\x2C\x31\x01", "\x92\x08\x73\x81\x88\x03\xEA\x63\x8A\x17\x07\x97\x6A\x2D\x01\xE8\x80\xB1\x66\x5E\x4D\x1F\x81\xE1\x1F\x07\x94\x03\xB1\xCE\x3E\x7D\x83\x81\x3C\x80\x1A\x03\x75\x6E\xB9\x09\x04\xA7\x01\x86\x81\x81\x71\x48\x06\x23\x85\x10\x8A\x07\x91\x9D\x69\x79\x13\x81\xA1\x66\x37\x81\x20\x72\x25\x78\x9A\x50\xD8\x4D\xCE\x1F\x70\x82\x17\x10\x70\x2C\x51\x07\x04\x82\x60\x00\x26\xE0\x32\x0C\x8B\x73\x0D\x7A\x95\x56\x05\x7A\xD8\x30\xC1\x5B\xA9\x66\x42\x84\x6C\x06\x2D\x8A\x3F\x06\x76\x24\x19\xC1\x4A\xDA\x6B\x4F\x76\x52\x89\x2B\x99\x50\xFB\x6B\x7C\x52\x31\x0D\x9F\x22\x70\x38\x01\x52\x83\x29\x87\x16\x58\x82\x79\x45\x59\xD2\x7C\x6C\xD5\x3A\x57\x80\x7B\x32\xFC\x47\xC6\x12\x05\x98\xFB\x60\x54\xE2\x14\x5B\x82\x3F\x0B\xD1\x69\x0B\x83\xBB\x71\x17\x3D\x81\xEE\x0B\x5F\x80\x2C\x57\x06\x02\x0C\x81\x04\x78\xD9\x22\x00\x7A\x6C\x20\x78\x32\x80\x4B\x54\x83\x71\xC1\x4E\xB1\x31\x81\x86\x6D\x6D\x78\x0E\x77\xBC\x33\x0D\x98\x05\x9D\xC3\x56\x81\x83\x05\xF7\x38\xAA\x7C\x0D\x03\x0A\x29\x08\x35\x03\xF1\x4F\xF3\x81\x76\x6E\x9C\x5B\xC0\x42\x10\x12\xA4\x0B\xF0\x73\x81\xAB\x76\xAC\x67\xA0\x7A\x08\x7B\x35\x79\x01\x04\xED\x02\x02\x46\x76\xB8\x75\x12\x76\xD1\x72\xB5\x6C\x9B\x51\xFA\x4E\x70\x77\x76\xB4\x64\xA5\x7E\x15\x74\xB7\x77\xF4\x5E\xAD\x56\x76\x9A\x7D\x96\x77\xCA\x70\x61\x70\xB8\x67\xD5\x6F\x9E\x07\x77\xD7\x3B\xC4\x76\xD8\x76\x0C\x76\x5D\x4E\xDC\x6B\xFA\x66\x76\x23\x82\xA7\x65\xAB\x7A\x9A\x7F\xEA\x7E\x86\x71\xFA\x6E\x76\x8A\x7C\x3C\x10\xA3\x7F\x5C\x5B\x79\x6C\xDA\x4F\x04\xCE\x76\x11\x82\xA5\x77\x98\x5B\x6E\x7E\x10\x90\xC5\x7D\xED\x78\x55\x57\x76\x8F\x78\xA7\x63\x6B\x7F\x11\x80\xF5\x61\x04\xF3\x81\x29\x83\x31\x73\x93\x3C\x69\x67\x12\x89\xC3\x6A\xFA\x51\x66\x6C\x71\xA9\x67\xD5\x7E\xCF\x7D\xB6\x78\x5C\x29\xDA\x14\x71\x43\x33\x1E\x30\x05\x52\x1F\x8F\x7B\x38\x47\x23\xE5\x5D\x50\x77\x5C\xB0\x54\x78\x01\x66\x57\x87\x75\x01\x3B\xE1\x06\x02\x67\x82\xB4\x57\x1C\x06\x0F\x75\x5D\x76\x5F\x67\xE2\x1F\x3C\x3B\x58\x62\x72\x08\x03\x68\x57\x8C\x7A\x5A\x41\x80\x74\x55\x8B\x71\xC5\x2B\x51\x38\x14\x79\xB6\x42\xC5\x76\xE4\x54\x54\x6F\x83\x15\x19\x5C\x83\x15\x78\x89\x66\xC6\x5A\xE2\x6B\x6E\x7B\x77\xB9\x2A\xA4\x7E\x11\x71\x8A\x76\xFC\x23\xE2\x37\x5E\xCF\x2B\xC0\x83\x50\x33\x30\x8E\xC2\x45\xC6\x74\x7B\x55\x6E\xC8\x70\x9B\x82\x4F\x80\xD3\x73\x22\x4B\xB6\x6F\xA1\x51\x04\xCE\x6C\xAE\x18\xB4\x6A\x06\x0A\x0E\x07\x09\x25\x06\xD5\x6D\x3D\x3D\x6B\x6D\x8F\x39\xE4\x78\x86\x40\xC9\x4E\xEC\x1A\x4E\xAC\x4B\x6F\x6E\x6B\x85\x54\x64\x14\x02\xB7\x65\xE4\x7F\x7C\xE5\x6D\xB7\x1A\x93\x4D\x8F\x66\x6D\x6F\xF3\x7D\x07\x7A\x26\xAB\x83\x52\x31\xD5\x4C\xDB\x67\xB9\x5E\xB6\x44\x74\x61\x6D\xC1\x4D\x8B\x6C\x6E\x87\xD9\x6C\x37\x3B\x6D\x12\xE4\x75\x6D\x14\x73\x7B\x6C\x0D\x07\x22\x72\x10\x19\xC8\x5A\xA2\x1D\x04\xFE\x6D\x0E\x04\xC0\x6A\xFD\x67\x1D\x8A\x6E\x17\x21\x15\x6E\xBF\x1B\xDB\x80\xF9\x51\xD9\x67\x58\x53\xB8\x5B\x0D\x13\x51\xE6\x82\x9F\x02\x7E\x3F\x12\x58\xE8\x61\x04\x72\xDB\x61\x77\xB8\x76\x92\x39\xCC\x45\x58\x75\x47\x58\xB1\x69\x07\xF2\x00\x70\x6F\x62\x53\x43\x3E\x2A\x5C\x15\x99\x0B\x13\xCE\x25\x6E\x5C\x6E\xE2\x2D\x60\x71\xF6\x69\x07\x03\xCC\x73\xD9\x07\x73\xCA\x0F\xC4\x70\x81\x81\x15\x82\x0E\x83\x05\x51\xB1\x3D\x7C\x0C\x2C\x51\x3C\x50\x56\x13\x86\xA4\x43\x46\x71\xDD\x64\x4E\xFC\x83\x1B\x03\xE9\x6E\x20\x0B\x21\x80\x10\xA9\xDE\x48\x6E\x1E\x52\xD8\x2A\x8C\x5E\x35\x41\x76\x70\xBD\x44\xE6\x32\x6F\x54\x32\xDA\x6C\xEC\x30\xED\x67\x7B\x67\x4B\x40\x5E\x1C\x5A\x34\x6F\xDE\x6E\xF0\x6C\x7B\x17\x0F\x83\x08\x37\x03\x95\x53\xC9\x6F\xF6\x55\xE4\x64\x1F\x81\x10\x1E\x07\x9D\x7B\x2D\x72\xE1\x3C\xE2\x2F\x85\x3B\xFB\x6D\x9F\x52\x50\x6D\x61\x4E\x01\x27\x02\x24\x86\xA6\x2B\xFB\x66\x7E\x64\xBF\x71\x06\x5B\x83\xD8\x40\xF6\x6C\xB0\x69\x17\x8B\x7D\x76\x43\x4C\x09\x87\x54\x4E\x85\x87\x28\xC4\x69\x10\x5B\x7E\x75\x87\x4F\xA8\x54\x84\xF0\x6E\xC6\x65\x85\x85\x42\x50\x82\x60\xEC\x33\x00\x78\x6F\xFA\x6E\x98\x44\xE4\x4F\xDC\x74\xE5\x79\x43\x49\xB9\x01\x70\x8F\x72\xB1\x7A\x65\x3B\xF3\x46\x80\x71\xC3\x43\x1D\x31\x54\x09\x71\x2E\x6F\x02\x72\xCB\x50\x66\x64\xED\x28\xF5\x40\x4F\x96\x74\x03\x52\x74\x55\x5F\x48\x66\x72\x03\x49\x01\xCB\x68\x6D\x6D\x41\x04\x36\x85\xBB\x0A\x0D\x9D\x2E\x2D\x61\x5D\x81\xD1\x3B\x13\x71\x9E\x69\x05\x7B\x67\x6F\x13\x8C\xA8\x49\x81\xE5\x81", "\x57\x80\x33\x82\xBC\x36\x83\x7D\xF3\x09\xDA\x6D\x81\x64\x55\x6A\x81\x0F\x71\xF2\x0D\x8E\x6F\xC6\x65\xAE\x51\x71\x35\x01\x69\x73\x40\x05\x1A\x7E\x8C\x66\x5C\x63\x08\x50\x84\x56\x31\x7E\x73\xEE\x57\x20\x74\xBC\x44\xC8\x66\x24\x33\x85\xB7\x56\x84\x70\x39\x76\x7F\x37\xBC\x56\x5B\x04\xE2\x47\x7E\xEC\x71\xD1\x56\x3B\x77\x54\x80\x8F\x76\x01\x32\xE3\x03\x02\xF4\x71\x56\x87\x3D\x75\x61\x29\x8D\x64\x17\x40\x9D\x5C\x71\x8A\x02\x71\x70\x42\x76\x56\x8D\x8D\x74\x15\x9F\xE3\x36\x2B\xD4\x85\xE0\x56\x40\x73\x57\x83\xA4\x5D\x15\xA7\xA4\x43\x71\x84\x83\x87\x70\xAC\x5A\x46\x8C\xBE\x4B\xC9\x52\xDA\x4F\x3D\x40\x84\x4C\x30\x4C\x75\x84\x59\x2E\x95\xC9\x57\x06\xC7\x81\x9F\x53\x9C\x73\xFE\x56\x22\x0D\xBF\x55\xEF\x69\x0B\x82\x58\x8D\x2F\xA2\x72\x01\x5E\x42\x1D\x86\x2A\xCA\x4A\x53\x4B\x58\x4E\x73\x6A\x28\x54\x72\x26\x32\x95\x6A\x2D\x19\x66\x29\x3A\xD0\x59\x73\x2B\x55\x77\x5A\x78\xF5\x3C\x60\x5B\xE5\x79\x16\x03\x85\x13\x85\x81\x83\x63\x4E\x95\x4D\xC3\x08\x08\xB4\x51\xB2\x67\x05\x85\x31\x87\xDB\x55\x29\x8E\x10\xB1\x09\x90\x84\x92\x73\x8F\x6C\x65\x71\xFA\x5E\x20\x56\x01\x31\x00\x4A\x84\x06\x02\x94\x87\x69\x64\x33\x7C\xC2\x22\x08\x66\xB1\x14\x64\x10\x84\xDF\x71\x69\x73\xC6\x47\x9A\x66\x89\x74\x64\x23\x35\xAB\x73\x95\x61\x6B\x77\x35\x7D\x9C\x62\x7F\x4F\xE7\x64\x5F\x8A\x46\x19\x01\x38\x07\x24\x03\x34\x96\x81\x71\xB4\x78\x62\xB6\x72\x33\x5A\x98\x5B\x37\x7F\xF1\x76\xD4\x03\xC4\x3F\x73\x47\x80\xA8\x85\x5F\x6C\x38\x78\x33\x86\xCE\x4D\xC4\x00\x2F\x9F\x4D\x96\x61\x4F\x42\x8F\x58\x9F\x65\x76\x6D\x61\x7E\x73\x3C\x08\x00\x75\xB4\x5F\x4F\x70\xEF\x5E\x91\x43\xEA\x75\x74\x2F\x75\x3B\x76\x7C\x71\xA4\x4E\xED\x4D\xD0\x4D\xE3\x6E\x02\x58\x74\xFD\x73\x73\x43\x43\x72\x03\x1E\xD2\x46\x04\x76\x86\xC9\x33\x1B\x74\x25\x31\x49\x7B\x18\x51\x57\x42\xEA\x5E\x4B\x4F\x75\x42\x76\x3A\x5A\x4A\x78\xA7\x2B\xD3\x61\x7F\x4C\x32\x7A\x86\xB8\x87\x9F\x71\xCF\x22\xA7\x6C\xD1\x74\xE9\x08\x74\x30\x74\xAB\x87\x41\x4C\x48\x76\x07\x16\xD7\x09\x0E\xB6\x74\x8B\x87\x6A\x29\xA0\x76\x71\x87\x36\x90\x1C\xAA\x0D\xCE\x5C\x55\x63\x6A\x2A\xA2\x74\x19\x74\x77\x33\x1B\xAF\x82\x1B\x74\x12\x74\x3A\x5D\xDE\x87\xCE\x51\xEE\x53\x01\x2E\x94\x33\x00\xFA\x3B\x33\x03\x0A\x22\x76\x81\xC6\x33\x01\x22\xE8\x36\x74\x58\x44\xDB\x85\x4C\x5B\x06\x04\x36\x82\x01\x1C\x89\x38\x74\x8F\x86\x20\x75\xE4\x87\x08\x65\x38\x8F\xAA\x01\x01\x64\x00\x47\x3B\xDC\x87\x47\x44\x77\x80\xA7\x6F\x13\x59\x6A\x49\x74\x2E\x74\xC9\x43\xF0\x84\x70\x8C\x36\x93\xAB\x19\x55\x46\x74\xBA\x86\x1A\x34\xF3\x82\x49\x72\xCE\x46\x01\x0F\x0F\xC1\x87\x67\x75\xC1\x85\x84\x59\x74\x85\xFB\x37\x1C\x2A\xD7\x58\x87\xCB\x87\xDE\x85\x15\x28\x78\x8D\x39\x82\x1E\x9F\x0E\x94\x63\xC5\x87\xE5\x57\xE5\x03\x80\x06\xA5\x77\xD0\x6E\x0E\xE4\x5D\xB0\x86\x1A\x01\x15\x03\x05\x2B\x3F\x95\x1D\xA9\x0F\xCD\x87\xBF\x87\xBD\x84\xF8\x82\x70\x83\x15\x67\xD4\x62\xBA\x50\x3A\xC8\x86\x7B\x35\xF6\x84\x12\x3B\x3D\x8B\x0C\x55\x53\x70\x44\xEC\x86\xC0\x84\xA1\x71\x6D\x86\xA8\x7A\xD8\x39\xE9\x56\x87\x62\x00\x05\x8B\xFF\x84\x7B\x82\x65\x3E\x1E\x91\x10\xD1\x87\x41\x75\x5D\x5C\x3B\x5A\x7E\x87\x06\x07\x1F\xBC\xE9\x0B\x88\x6E\x03\x06\x88\xB5\x5D\x9A\x2B\x3E\x82\x20\xAD\x0F\xE1\x87\x05\x88\x0B\x88\xA2\x72\x5C\x84\x3F\x8E\xA7\x36\xEA\x62\x64\xB8\x75\x8C\x4D\x1B\x33\x57\x7D\x76\x1D\xD5\x59\x9C\x56\x77\xF1\x82\xDD\x75\xC7\x85\xAE\x51\x73\x59\x38\x5C\xEB\x64\x53\xDE\x74\xF1\x53\x88\x64\x06\x03\xAE\x61\x08\x25\xEB\x2E\x60\xE8\x74\xD8\x16\x84\x63\x61\x80\xD9\x69\x2B\x42\xFB\x3E\x49\xC6\x17\x0D\x67\xFE\x15\x5E\x79\xAF\x7E\x92\x53\x74\x0F\x4B\xFD\x82\x32\x03\x6A\x11\xDE\x67\x27\x64\xBE\x2C\xEE\x28\x72\x98\x1B\x0C\x21\xDD\x09\x8C\x82\x96\x7D\xF5\x75\x1D\x73\x6D\x30\x2E\xAB\x17\x4B\x3E\x6A\x1A\xCB\x36\x05\x27\x04\x76\x88\xD4\x76\x9D\x14\xA3\x79\x6C\x21\x37\x16\x32\x7C\x11\x9E\x40\x4F\x2A\xAB\x14\x6B\x44\x5D\x09\x34\x1E\x23\x86\x2D\x6B\x55\x36\x0B\x42\x8A\xE0\x34\x5C\x47\xD7\x31\xD0\x2A\x2D\x48\x02\xE3\x29\xDA\x70\x24\x8D\x49\x39\x0E\x52\x12\x8B\xA2\x36\x2B\x31\x30\x9D\x17\x59\x76\x79\x76\xB7\x1E\x9C\x4A\x53\x1B\x77\x61\x89\x15\x62\xF0\x2D\x7A\x74\x7C\x2E\xDF\x7C\x35\x5A\x0C\x5F\x88\xF9\x75\x18\x8B\x8C\x88\xBF\x67\x25\x94\x05\x77\x5C\x57\x79\x99\x7C\x89\x01\x94\x79\x4F\x70\x01\x06\x01\x2B\x20\xB7\x89\x30\x7B\x53\x0B", "\x8C\x7D\x01\x90\x10\x81\xA9\x01\x6E\xB1\x78\x57\x8B\xA0\x2C\xA1\x65\xCB\x67\xF9\x50\xD4\x73\x78\x2B\x7F\x5D\x78\x1D\x04\xA2\x69\x0B\x96\xA8\x4D\x20\x7A\x78\x36\x7F\xD2\x7A\x08\x07\x01\x8A\xE1\x6D\xF0\x4A\x8D\x2C\x83\x69\x4D\x60\x8B\x60\x1A\xA1\x63\xCB\x65\xF9\x76\xF2\x28\x7E\x98\x7F\x90\x82\x2E\x7A\xCE\x7C\x4C\x9D\x86\x4E\x13\xF0\x0F\x8B\x69\x1A\x78\x04\x7A\xEC\x21\xEE\x63\xF7\x5F\x95\x17\x78\x64\x49\xB1\x49\x83\x84\x83\x73\xC4\x6D\x1A\x8B\xFC\x77\x4D\xEE\x7C\x25\x79\x55\x6C\x89\x71\xC5\x69\xE1\x68\x56\x2A\x69\x09\x49\xBC\x49\x42\x39\xDF\x70\x4B\x7E\x16\x0B\xD2\x3D\x29\xDB\x39\xC8\x67\x4A\x12\xF8\x21\xCE\x24\xBE\x31\x12\x95\x7E\xF0\x0E\x1E\x84\x00\x05\xC0\x47\xDA\x7E\x9F\x51\xCE\x0B\x4C\x3C\x7F\x16\x6A\x19\x88\xAC\x69\xC5\x69\xC9\x6C\xF6\x36\x69\x61\x73\x07\x1B\x58\x77\xA3\x87\xA3\x45\x25\xAF\xF3\x73\x79\x13\x3A\x78\x78\x3D\x79\x72\x6C\x4A\x9B\x98\x44\x99\x02\x10\x77\x5D\xE7\x7F\x91\x02\x7E\x78\xB9\x60\x00\x18\x01\x8D\x7A\x54\x03\x30\x8B\x33\x14\x8C\x84\xFE\x79\x25\x37\xB9\x21\x83\x10\x7F\x98\x7C\x47\x7F\xB0\x64\x0A\x07\x09\x05\x15\xB4\x80\x3E\x6C\xD8\x79\x03\x81\xC9\x28\x95\x50\xF6\x52\x00\xB9\x09\x6C\x78\x6F\x8A\xF8\x53\xFD\x72\x55\x6A\x2A\x92\x00\xB5\x6B\xC2\x82\xA7\x8B\x4C\x8A\x98\x81\x55\x8D\xE1\x6D\x37\x62\x57\x42\x7C\x3A\x03\xF4\x7E\xA2\x81\xE7\x5D\x0A\xB3\x12\x3C\x8A\x18\x68\x21\x86\xA1\x60\xEA\x44\xE4\x7E\xA8\x59\x82\x63\x7E\x49\x7C\x69\x8B\x92\x7E\xC4\x7D\xE4\x6B\xEC\x4C\x8C\x0D\x7B\x04\x6D\x29\x7D\xDB\x56\xCA\x73\xCB\x73\xFC\x61\xF9\x5B\x7C\x5F\x7C\x1A\x7C\xC4\x56\xB2\x77\xE3\x71\xA7\x78\x38\x32\x69\x6B\x8A\xF9\x19\x5B\x8B\x7D\x61\x03\x14\x01\x30\x15\xEE\x83\x4A\x7D\x12\x7C\x36\x6D\xAE\x8F\xDB\x77\x2B\x91\xF9\x65\x78\xEC\x74\xE2\x79\x64\x78\xC6\x7B\xD9\x75\xEC\x5C\xF9\x21\x65\xEC\x68\x1B\x7D\x67\x88\xBA\x77\x58\x84\xF3\x49\x16\xAA\x65\x63\x8A\x34\x7D\xE4\x66\x2B\x8D\x47\x73\x94\x5B\x14\xC2\x79\xAF\x4D\x53\x3C\xCA\x61\xA4\x81\xF3\x63\x29\xB2\xA9\x26\x8A\x16\x57\x5B\x7E\x87\x03\xA2\x3E\xEB\x6B\x25\x97\x0D\x42\x2F\xBE\x7D\xB0\x82\xED\x67\xD8\x75\x87\x70\x9E\x74\x1A\x5B\x38\xCB\x7D\x66\x7C\xAD\x0F\x77\x63\x1B\x81\xB5\x12\xFB\x5D\x3C\xD4\x7D\x56\x0F\xF1\x66\xEB\x49\x3C\x7E\xE5\x40\xC8\x4C\x67\xE8\x89\x6E\x7C\x23\x6B\xE4\x3B\xCD\x37\xE1\x5E\x73\x01\x41\x15\x79\x86\x28\x3C\x8E\xBB\x3F\xA1\x47\x06\xBD\x82\x6A\x7D\xF6\x89\x05\x48\x5F\x8A\xFB\x41\x57\x5A\x2B\x63\xD2\x7D\x39\xA6\x68\x81\x88\xBD\x7F\x9F\x8B\xC2\x76\xF7\x5E\x15\xE3\x29\x04\x8B\x2E\x61\x0C\x7C\x31\x0F\x50\x91\x26\x93\xFC\x28\x09\x1B\x7E\x8F\x6A\x0D\x01\xE7\x73\x10\x1B\xF9\x41\x18\xC3\x7A\x3F\x7E\x3F\x79\x66\x8E\xE0\x50\xB3\x36\x69\x61\x7D\x03\x79\x4F\x7F\x94\x4A\x21\x79\xE9\x73\x53\x69\xE4\x76\xD4\x25\x35\x10\x8D\x31\x36\x4E\x6A\x91\x72\xF5\x69\xF8\x54\xF2\x16\x36\x80\x7A\x96\x80\xD6\x7F\x36\x16\x00\x9D\xFA\x5F\x38\x42\x70\x52\x68\x1C\x03\x63\x8C\xD1\x49\xCD\x72\x27\x8C\x6B\x6E\x6A\xDD\x78\x77\x38\x2D\x2E\xED\x7E\x3E\x20\xE8\x76\xD5\x19\x6B\xE5\x78\x1B\x6F\x5E\x6E\x08\x83\x35\x95\xEF\x40\xD6\x52\x0F\x7C\x7F\x49\x32\xE6\x7B\xAC\x8C\xFE\x64\x03\x17\x74\x76\x00\x27\x02\x24\x8D\xE2\x7D\xFA\x7D\xFE\x7C\xFF\x6E\xFE\x70\x7F\xFF\x7F\x70\x30\xEB\x6B\xF6\x77\xD5\x75\xFD\x5B\x15\xFE\x8A\xE6\x7F\xDC\x7E\xA2\x58\x79\x07\x02\x84\x23\x08\x54\x32\x8A\x45\x8C\x22\x8F\x06\x86\xB5\x65\x03\x18\xFE\x43\x04\x5A\x7F\x1A\x81\xE8\x7F\xE6\x7E\xC9\x8F\xFE\x60\xFF\x7B\xD6\x22\x7F\x04\x81\x2B\x8E\x01\x85\xB1\x2E\xA2\x23\xA8\x29\xFF\x72\x78\xF9\x7F\xAB\x88\x07\x87\xC9\x82\x85\x31\xFF\x70\x19\xA1\x80\x72\x8D\x09\x80\x89\x04\xCE\x8E\x62\x78\xFF\x6B\xFF\x63\x8C\x6B\x8D\xE0\x7D\x07\x80\xF6\x7E\xD4\x72\xFD\x5E\x00\xA8\x80\xF3\x7E\x11\x80\x70\x78\x01\x8C\x65\x8A\x00\xBD\xFE\x07\x8D\x6A\x8C\xF9\x68\x2B\x7A\x0A\x31\x01\x81\x34\x95\xF1\x40\x80\xBF\x32\xE5\x7D\x06\x82\xF3\x7A\x69\x9B\xE1\x34\xD4\x4D\x7F\x56\x8D\x73\x88\xE1\x28\xD4\x8D\x51\x22\x35\x9D\x19\x80\x5A\x40\x8A\x16\x80\x1D\x0E\x05\x81\xDB\x62\x30\xB3\x00\x86\x02\xB7\x8D\xED\x7F\x87\x68\x37\x30\x64\x7D\x0A\x0B\xD9\x2D\x6C\x45\x6D\x03\x68\x8A\x6D\x75\x2E\x03\x84\xB1\x48\x00\xC2\x80\xD3\x5A\x0F\x4C\x67\x6C\xC6\x62\xB8\x68\xE7\x5F\xFA\x3E\x72\xC2\x65\xD6\x02\x8E\x6E\x5B\x05\x53\x98\x02\xAC\x01\x99\x81\x09\x3A\xCF\x76\x0B\x87\xDA\x89\x3A\x79", "\xE7\x21\x11\xA6\x77\x03\x02\xD3\x75\xBC\x6C\xDB\x8F\x3A\x6A\xDD\x4F\x98\x70\x6C\x93\x3D\x87\x38\x73\x39\x72\x6F\x1F\x82\x05\x9D\x17\x77\x5C\x8B\x84\x00\x0C\x87\x3A\x49\x5B\xA4\x4F\xEE\x1E\x03\x92\x85\xE0\x80\x4A\x87\x3C\x8B\x15\x88\x29\x8D\x06\x9A\x0A\xB3\x70\xCD\x81\x74\x80\x34\x83\x1D\x89\x7E\x5B\xC1\x56\x17\xBA\x81\x40\x0C\x31\x87\xC6\x6F\x48\x53\xE9\x33\x37\x8E\x9F\x62\x2E\x90\x85\x5A\x2F\x37\x81\x1C\x88\xEE\x63\x07\x9D\x9F\x7E\x8D\xCB\x80\x80\x8E\x78\x3F\xFF\x6A\x0E\x95\x05\xAC\x03\xE3\x54\xEC\x2A\x1E\x73\x2E\x85\x45\x53\x8B\x60\x0F\x21\xB0\x37\x71\x52\x81\xAF\x13\x57\x80\x67\x52\x20\x8B\x2C\xA2\x06\xFC\x26\xA1\x83\xAE\x19\x1B\x34\xDA\x66\x10\x14\x39\xBC\x06\xA9\x83\xBE\x82\x98\x00\x70\x84\x6F\x28\x4D\x9A\x2A\x91\xC9\x5D\x6D\x62\x1B\xE3\x83\xA2\x66\x36\x8C\x2D\x8C\xB6\x75\x7B\x59\x6F\x41\x1B\x36\x7D\x9B\x07\xCC\x7D\x26\x00\x22\x4F\xCA\x10\x8B\xB1\x65\x9C\x8E\xFC\x78\x30\x37\x4C\x96\x95\x62\xC7\x75\x7C\xDD\x65\x8E\x82\xC2\x75\xD9\x8D\xE9\x66\xD8\x45\x05\xDD\x7C\x0D\x7E\xDF\x4A\xDD\x14\x8B\x81\x25\x78\xD7\x71\xC9\x31\x00\xFC\x74\x81\x02\xBF\x70\xB5\x42\x75\x99\x93\x6F\x04\x2D\x64\x1D\x77\xAC\x8D\xC1\x71\x6B\x7C\x75\x84\x0A\xBD\x18\xA2\x4B\xA3\x7E\x7B\x74\x46\x1C\xDE\x6A\x4D\x08\x0F\x9D\x08\x61\x88\xE2\x16\x32\x89\xBF\x6D\xE5\x88\x6E\x61\xC9\x72\x01\x7E\x8E\xDE\x83\x4A\x50\x11\x77\x24\x09\x89\x4F\x0F\xB3\xE5\x41\x88\xE4\x77\x21\x8A\x95\x56\x3E\x8D\x21\x04\x38\x11\x0C\xD3\x18\x95\x41\x8A\x85\xE4\x67\x48\x45\x8B\x4A\xCC\x6A\x15\xC9\x8E\x44\x85\xEE\x6E\x91\x84\x06\x00\x7E\x61\x52\x01\x82\x57\x84\x41\x35\xF3\x6F\x96\x86\x14\x36\x49\x8C\xD2\x37\x06\xD5\x84\xC9\x6D\x0B\x3D\x38\x74\xC3\x31\x8E\x7A\xEF\x0A\x19\x86\x02\xB7\x8F\x7A\x73\xAD\x81\x08\x00\x44\x83\xDE\x58\xEF\x76\x72\xC4\x74\xFF\x6D\x9C\x81\x0B\x68\x65\x23\x11\x04\xDC\x63\x32\x0A\x72\xC4\x07\xAF\x81\xB0\x2B\x21\x1A\x30\x2A\x7E\x44\x72\x5C\x73\xA3\x70\xBF\x84\x06\x0E\x2F\x94\xB4\x00\x0C\xF9\x16\x0F\x59\xEA\x39\xC1\x85\x82\x53\xD6\x3E\xC8\x4B\x0C\xF0\x39\x59\x73\x29\x7A\x27\x3E\x42\x13\x32\x90\xCE\x42\x86\x37\x00\x30\x01\xA2\x86\x41\x02\xFD\x8B\x32\x9C\x87\x57\xC4\x2E\x86\x82\x58\xDD\x72\xF0\x8C\xAF\x7F\x23\x68\x08\x6B\xB1\x31\x42\x84\x85\xE0\x72\x2B\x7B\x38\x7E\xC1\x25\xCE\x44\x0F\xD7\x86\xFA\x17\xAC\x86\x72\x76\x25\x62\x11\x77\xD2\x5A\xE8\x6D\x30\x76\x87\x81\x00\xDE\x83\x6F\x8F\xA6\x7C\x20\x87\x95\x0E\x4A\x3E\x75\x09\x8A\xF4\x87\x7D\x89\x9E\x64\x1F\xB3\xE8\x07\x87\x77\x33\xCB\x84\x86\x75\x77\x8C\xA3\x70\x40\x83\x10\x94\x88\xE2\x87\xB5\x87\xE4\x83\x4F\x7B\xC7\x5A\x40\xBC\x0D\xAB\x88\x22\x00\x26\x76\x07\x97\x85\x84\x40\x8A\xD0\x54\xE9\x47\x3A\xAD\x87\xD7\x87\x9B\x2D\x7F\x86\x10\x14\x41\x89\x67\x28\x88\x19\x02\x15\x8A\x9B\x09\xCF\x21\x40\x8A\x1C\xAC\x20\xA0\x90\x31\x88\xD0\x87\x94\x76\x78\x89\x40\x87\x21\x9B\x10\xFD\x86\x0F\x89\xEF\x87\x0F\x93\x02\x95\x41\x82\x42\xB1\x0F\x95\x4D\xD7\x86\x23\x93\xEE\x81\x73\x82\x02\x1E\x20\xAE\x10\x92\x88\x68\x86\x26\x91\x08\x96\x09\x95\x3D\x95\xA6\x22\x0B\xA6\x88\x7B\x58\x1C\x90\x1C\x02\x07\x98\x15\x19\xB3\x2D\x10\xBE\x90\x58\x90\xCF\x85\x13\x90\x7E\x8D\x85\x85\x1F\x8A\x18\x7B\x56\xF6\x87\x57\x40\xEC\x81\x75\x81\xD4\x15\x73\x63\x21\xAC\x87\x17\x74\x1A\x02\x4B\x4C\x06\x0A\xDF\x3C\x05\x27\x04\x7E\x90\x61\x38\x1A\x03\xED\x83\x0C\x98\x25\x42\x44\xB1\xB4\x34\x00\xBD\x86\xD7\x25\x34\x34\x81\x8F\x81\x9A\x42\x81\x21\xEC\x90\x07\x4A\x3B\x09\xF8\x3D\x10\x9F\x11\x48\x44\x8D\x0F\xAE\x27\x83\x2A\x46\x93\x12\x91\x84\x8F\x7F\x91\x44\x81\x45\x75\x87\x32\x64\x3D\x90\xB9\x5C\x0F\x94\x03\x0A\xF3\x42\x04\x6C\x7C\x6E\x02\x43\x90\x8D\x36\x12\x9E\x80\x93\x26\xB5\x44\x19\x35\xDB\x86\x10\x8B\xF4\x86\x80\x83\x42\x8E\x55\x58\x20\xC9\x33\xAA\x90\x4A\x30\x2B\x96\x81\x8E\x8A\x99\x44\xA9\x10\x8D\x91\x9C\x91\x34\x74\xA2\x76\x8E\x00\x6D\x58\xB7\x16\x2D\x2A\x29\x74\x89\xC8\x65\xE0\x88\x75\x7A\x47\x8E\x28\x91\xFC\x10\x8A\x13\x0E\x5A\x89\x91\x7A\x06\x08\xF1\x62\x08\x1A\xFC\x15\x8A\x01\x7C\x6A\x88\x64\x77\x9A\x89\xC6\x61\xE0\x5C\x13\xA4\x7E\xF7\x8B\x6F\x88\x44\x6D\x5C\x67\x6F\x4C\xF9\x7F\x95\x2E\x7E\x58\x8D\x89\x0E\x29\x8B\x9B\x80\xBF\x70\x44\x6A\x12\xB1\x00\xF5\x76\x86\x0A\x7B\x84\xA2\x7A\xE2\x75\xAA\x7E\x12\xA0\x7A\x43\x6A\x91\x7A\xFC\x71\xD6\x80\xF3\x76\xB0\x43\x15\xE1", "\x7E\x2A\x01\x15\x21\x40\x90\xA9\x8A\xDA\x69\x33\x8C\x19\x90\x43\xDB\x6D\x9E\x8B\x37\x94\x98\x84\xD9\x06\x1A\x7C\x57\x78\x7A\x3D\x6C\x3F\x6A\x0D\x81\xC8\x68\x03\x87\xFF\x7B\x00\x84\x5B\x3D\x81\x5F\x8C\xAB\x88\xA1\x48\x6C\x84\xCE\x25\xD9\x77\x7E\xA6\x72\x1E\x8C\xDE\x7C\x61\x79\x77\x9D\x22\x93\x1B\xED\x79\x60\x8C\xF9\x76\x98\x8A\x98\x8A\xDF\x32\xE8\x46\x04\x2E\x92\xDB\x7E\x7A\x93\x72\x6A\xCB\x00\x77\x84\x40\x77\x58\x19\x7A\x9E\x7C\xAE\x8C\x4E\x96\xEB\x87\x77\x8A\xF9\x79\x23\xF0\x75\x23\x7B\xED\x1B\x69\x88\xFE\x05\xDD\x60\xF8\x71\x00\x36\x00\x2B\x8D\x5D\x6B\x52\x7B\xAE\x83\x59\x9C\x71\x15\x16\x92\x46\x78\x8A\xCC\x89\x4D\x93\xBB\x47\xB2\x5C\x2C\xBF\x15\xB2\x7C\x81\x8B\x2E\x7C\x61\x8B\xB4\x88\xE3\x65\x2D\x8C\x06\x0E\x78\x8D\x68\x08\x79\x0D\x05\x9D\x80\x5E\x9B\xE1\x6F\x13\xBD\x78\xDA\x78\xC6\x71\x1D\x48\xBD\x8D\x43\x66\xA8\x78\x13\xED\x8B\xA2\x68\x78\x7C\x29\x6C\x9F\x86\x5F\x88\xA5\x74\x17\xFD\x89\x03\x8A\xF1\x8E\x7E\x89\xA8\x8E\x8F\x98\x46\x8C\x06\x35\x7E\xBB\x88\x3C\x68\x0E\x02\x14\x0B\x02\x24\x4C\xBA\x12\xA9\x79\xD2\x89\x04\x8F\x70\x7A\x3C\x61\xC8\x6F\x30\x85\xFD\x1A\x8C\x85\x78\x98\x6B\x21\x7D\xC2\x8B\xF4\x6B\xE4\x42\xF2\x0F\x93\x6F\x35\x0D\x8F\x85\x8D\xE8\x51\x4C\x75\xFA\x77\x13\xD3\x82\x8D\x2C\xA3\x6B\x33\x8A\xA1\x2E\x97\x83\xF1\x4A\x26\xFA\x8A\x4F\x39\xC6\x90\x53\x29\xC3\x89\x99\x91\x4C\x88\xFD\x01\x5A\x4A\x7F\xA8\x7D\xD3\x79\xA7\x60\xF5\x7C\x30\xB1\xD8\x1D\x93\x43\x5A\xAB\x7E\x88\x8E\xCF\x74\x62\x82\x34\xBC\x17\xCF\x91\xFE\x8A\x9A\x7C\x80\x8D\x34\x92\x25\x79\x01\x04\x18\x82\x02\x06\x8C\xE2\x93\x50\x28\xE8\x7F\xC7\x6C\x4C\x83\xFD\x18\x8C\x98\x93\x73\x34\xB0\x83\x32\x9D\xF1\x36\x30\x8C\xFD\x50\x93\x4E\x7E\xC8\x93\x23\x7E\x36\x97\x0B\x7A\xD4\x00\xD5\x1F\x93\xBB\x93\xD0\x92\xD6\x7E\x37\x96\x11\x09\x49\xAA\x19\xAB\x92\x07\x93\x2D\x3B\xED\x8B\x20\x09\x7B\x86\x48\x91\x04\x7B\x7F\x8A\x8C\x3E\x8E\xFF\x78\xF4\x74\xDF\x62\x11\x8F\x1A\xDE\x8C\x91\x8C\x4F\x8F\xF1\x7C\x04\x87\xFF\x7D\x08\x2F\x1A\xDF\x8C\x42\x8D\xDF\x7D\x92\x2D\xDA\x84\x6B\x8B\x2A\x86\x19\x91\x67\x3B\x8B\x98\x91\xA6\x8C\xF8\x2C\x8F\x8E\xE8\x34\xD3\x2F\x80\x8C\x8A\xA7\x58\x01\x20\xEA\x87\x89\x05\xED\x56\x15\x81\x8D\xB5\x6B\xF4\x6E\xF6\x62\x21\x94\x15\x1D\x2A\xAE\xF1\x19\x57\x0D\x95\x89\x0F\x43\x38\x42\x9E\x3F\x78\x01\x37\x1A\x83\x02\xB9\x8D\x7F\x92\x8F\x6B\x22\x9E\x6B\x95\x48\x9A\x19\x83\x2A\x17\x92\xFE\x41\x46\x96\x45\x95\x01\x81\x02\xAE\x4E\x44\x36\x1F\x92\x91\x91\x48\x94\xD9\x8F\x75\x9F\xA1\x4B\x07\xA6\x92\x59\x6D\x67\x8A\xCB\x8D\xAB\x1B\x6E\x7F\x0C\x94\x0F\x61\x88\x9C\x8F\x10\x6A\xB5\x6F\xF3\x87\x3E\x74\x40\x5F\xB0\x2A\x6D\x20\x3C\x1A\x03\xAB\x6A\x20\x01\x6B\x74\x40\x4A\x79\x38\x72\x7E\x50\x83\x61\xAD\x6A\x0C\x57\x86\x5C\xB5\x5C\x12\xA7\x52\xC5\x6C\xD7\x8D\xB0\x6D\xB9\x8D\xD5\x0A\x44\x6E\x1E\xA8\x68\x43\x3C\x64\x6C\x14\x53\x28\x97\xB9\x0C\x3A\x84\x05\x6F\x2C\xA6\x91\x80\x00\x9B\x7E\xB7\x42\x2B\x74\x3A\x8A\x13\xEC\x4B\xD1\x4B\x09\x72\xDD\x89\xFF\x83\xB8\x7A\x3A\x85\xEE\x5F\x8E\x0C\x7E\xA2\x6A\xD8\x89\xBE\x04\x76\x97\xD7\x6E\x1C\xF1\x64\x32\x01\xB4\x8D\x40\x03\xED\x87\x27\x6D\x3B\x82\xEC\x5A\x71\x41\x83\x9C\x91\xD4\x85\xEB\x84\x77\x80\x54\x97\xD9\x2F\x83\x43\x84\x09\x55\x0F\x36\xFB\x6B\x5A\x87\x2B\x84\xA8\x12\x54\x77\x5C\xD9\x8E\xAC\x81\x08\x04\x7B\x83\x55\xAD\x61\x6B\x93\xDD\x13\xD2\x4F\xA8\x95\xF7\x8C\xE9\x04\xDE\x62\x1B\x22\x51\x6D\x84\x21\x78\x2D\x2C\xF8\x89\x59\x26\x3E\xA3\x90\x48\x8F\xBC\x84\xCA\x57\xF2\x8B\x2E\x8D\x7C\x80\xAA\x10\x1F\xF9\x16\xFB\x85\xBC\x16\x2E\x3D\xFA\x8D\x78\x37\x3E\x9C\x3A\x59\x8F\x51\x73\xD4\x08\xF7\x8F\xD0\x6C\xDB\x37\xCA\x7D\xC7\x57\x49\xE1\x8E\x78\x69\x51\x77\x57\x9C\xE9\x1D\xC1\x08\xE5\x1D\x95\x00\x12\xE1\x2D\x51\x70\x96\x84\x4F\x7E\x2C\x79\x10\x90\x66\x6F\x2C\x1E\x88\x00\x01\x47\x64\xA9\x95\xEA\x69\x83\x62\x77\xF2\x83\x26\x36\x2A\x87\xBF\x5B\xB3\x78\xDA\x66\x16\xC9\x8E\xB3\x8F\x40\x4D\xED\x8A\x06\x08\xAA\x9E\x57\x2A\x2A\x94\x57\xBC\x8E\x6A\x2B\xB9\x90\xF2\x80\x7C\x9C\x88\x52\x76\x34\x95\xE6\x28\x5B\x97\x06\x61\xFB\x29\x7C\x8A\x0C\x3B\x2A\xCB\x0C\xCE\x8E\x84\x2A\xA8\x95\x20\x75\xAA\x85\xC8\x6F\x59\x2B\x01\x27\x02\x88\x97\xEA\x57\x56\x82\x04\x14\xA7\x3B\x2B\xBE\x8F\xE3\x77\x7E\x94\xB9\x45\xD3\x3A\xBB\x55\x14\x1D\xDB\x16\x05\x3A\x12\x2E", "\x3C\xA0\x2F\x0C\x92\x2B\x9E\x58\x85\x07\xA0\x96\xB4\x13\x38\x38\xC1\x91\x57\x97\x2B\x9B\x55\xB9\x24\x34\x13\xEF\x58\x58\x59\xBA\x68\xF1\x8A\xE6\x35\x44\x72\x00\x6C\x83\x01\x03\xC6\x8E\xE1\x8E\x62\x9E\x89\x58\x58\xA9\x2B\xB0\x95\x6D\x57\x20\x78\xE5\x89\xF1\x8B\x35\x07\x23\x91\x1E\x2E\x77\x6B\x88\x19\x00\x9B\x21\x21\x0B\xB4\x80\x59\x6F\x11\xFA\x95\x3D\x97\x56\x97\xEF\x8D\x78\x7A\xBD\x6F\x89\x24\x1B\x83\x05\xF8\x1A\xA3\x94\xE6\x10\x69\x91\x79\x0D\xC3\x0D\x2D\x83\x02\x4D\x96\x37\x89\xE4\x0C\x67\x90\xAC\x7E\x59\xBA\xEE\x47\x77\x5F\x94\xAC\x95\x3E\x3B\x93\x8A\x86\x4E\xEF\x06\x93\x20\x89\x32\x00\x64\x58\xEC\x18\x2E\x79\xB6\x92\x11\x24\x2D\xC2\x77\x52\x97\x8C\x94\xD5\x93\x77\x77\xB5\x92\x11\x38\x37\x6C\x96\x83\x50\xB7\x95\x1A\x88\x94\x8B\xEF\x2A\x03\x74\x2D\xED\x96\x98\x17\xBB\x94\xBA\x92\x77\x7C\x67\x26\xDF\x5D\xCC\x68\x77\x5E\x54\xB4\x94\xE2\x95\xDB\x84\xD9\x05\x3F\x80\x0D\xCD\x41\x37\x00\xA1\x84\xD1\x87\xFA\x55\x1A\x43\x8A\x5D\xE6\x70\x8F\x7D\x6F\x41\x59\xA0\x82\x4E\x80\x97\x32\x19\xB5\x0C\xB8\x47\xD8\x63\x9E\x93\xCD\x83\x8E\x52\x39\x9A\x19\xB7\x67\x3C\x42\x97\x58\xAE\x86\xFD\x82\x06\x93\x03\x14\x41\x83\x04\x36\x90\x0C\x89\x23\x90\x0A\x95\x9F\x4F\x41\x81\x1C\x80\x21\xAE\x90\x44\x91\xBD\x83\x5D\x32\x0C\x94\x86\x92\xB2\x0D\x94\x3D\x97\x12\x91\x60\x93\xF8\x83\x08\x98\x41\x9A\x20\x93\x21\xCD\x87\xDE\x86\x87\x48\xF4\x86\x77\x9E\x88\x80\x5E\xA4\x10\xE0\x90\x4C\x32\xE2\x96\xFA\x86\x8D\x6B\x81\x9B\x44\xB3\x22\xA2\x90\x28\x4A\x1A\x88\x1C\x91\x14\x9B\x87\x90\x53\x8F\x1D\x81\x91\x95\x90\x2A\x92\x22\x90\x16\x90\x8C\x9F\x5E\x9C\x21\x9E\x91\xB7\x90\x5D\x91\xFA\x92\x47\x79\x67\x38\x44\xAC\x2F\xDE\x97\x14\x91\x0B\x8A\xAB\x53\x7C\x9F\x36\x99\x08\x34\x00\x2F\x41\x7C\x90\x3A\x92\x97\x1E\x0E\x92\x88\x96\xD0\x72\xC8\x35\x00\x2E\x4B\x1A\x02\x7E\x3E\x00\x0E\xF5\x0C\x60\xA1\x71\x53\x43\xB1\x67\x54\x90\x96\x40\x82\x94\xA3\x35\x01\x3D\x0E\xBA\x72\xA9\x91\xF6\x95\xFE\x90\x51\x76\xFC\x06\xD2\x54\x30\x94\x31\x16\x99\xE6\x87\xBB\x3A\x17\x9A\xC1\x8B\x43\x95\x20\xCC\x97\xD5\x29\x23\x00\x15\x06\x83\x9F\x11\x41\x61\xAD\x22\xBC\x00\x1C\x96\xFF\x95\x09\x9B\x0B\x90\x89\x88\x29\x71\x3E\x2C\x98\x31\x5A\x17\x98\x2F\x96\x07\x01\xC3\x90\x03\x2C\x22\xB2\x91\x1B\x99\x03\x89\x0A\x9D\x08\x08\xC3\x95\x60\xBD\x0E\xBD\x00\x3D\x99\x1F\x98\xF5\x92\x79\x90\xBE\x92\xCD\x11\x01\x45\x98\x20\x99\xDE\x85\x08\x01\x89\x93\xC3\x8F\x44\xA7\x30\xCF\x90\xB1\x42\x22\x98\xB8\x5F\x42\x78\xC0\x84\x77\x4A\x30\xB4\x00\xF4\x01\x15\x21\x18\x9F\x81\x9D\xC2\x97\x60\x99\x6A\x4A\x98\xC9\x96\xF7\x97\x26\x3A\x7F\x92\x02\x1D\x60\xBC\xE9\x1F\x98\x6E\x02\x1D\x98\x0A\x93\x84\x99\xC1\x98\x5F\xA6\x30\x8D\x2B\x07\x4A\x15\x9A\xBD\x30\x8E\x99\x11\x12\x63\xAA\xE8\x30\x98\x67\x99\x2A\x99\xBD\x5A\x88\x9D\xC6\x9A\x62\xBB\xB1\x7C\x98\x70\x00\x3F\x9A\x38\x5C\x87\x91\xC8\x96\x63\xB4\x30\xEE\x00\x78\x98\x94\x48\xEF\x1B\x8F\x95\xC6\x8D\x1E\x88\x31\x8D\x99\x69\x90\xF7\x87\x1D\x9C\x8D\x96\xFD\x14\x64\xB9\x30\xD2\x98\x54\x98\x47\x9A\x15\x99\x92\x9D\xB0\x26\x64\xBD\x17\x81\x93\xA0\x78\xF8\x62\x2C\x88\xA5\x75\x03\x15\x46\x81\x04\x57\x91\xAB\x99\x11\x7E\x36\x94\x74\x96\x50\x70\xE5\x6A\xF1\x5C\x8A\xDD\x89\x70\x92\x31\x8F\x4E\x9F\x0C\x85\x47\x8A\x13\xE5\x89\x43\x3C\x55\x8C\x89\x01\x44\x94\x22\x0B\x81\x6A\x28\xE4\x8A\xEE\x6C\x32\x00\x3B\x18\xAD\x83\x47\x71\x29\x81\x28\x9C\x94\x65\x00\xF4\x90\x62\x19\xA7\x82\x03\x0E\x49\x83\x04\x30\x92\xEE\x92\xED\x1B\x2B\x8D\xA2\x7F\x8B\x78\xE8\x7F\xD7\x42\x82\x35\x6D\x9D\x91\xA5\x92\x75\x92\x4E\x81\xE9\x40\x25\xB8\x8A\x65\x01\xB0\x89\x51\x92\x4A\x69\x77\x29\x4A\x85\xFC\x55\x69\x82\x8B\x1F\x4F\x89\x7D\x37\x10\xE5\x73\x49\xAD\x19\xBF\x71\xEB\x8A\xAB\x92\xC4\x47\x9C\x6A\xDC\x72\xF7\x62\x16\xE1\x7C\xA4\x8A\x83\x8A\x76\x8F\xDB\x77\x03\x04\x4B\xA0\x73\x66\x92\x16\x78\xB4\x92\x8B\x89\x56\x98\x9D\x47\x2F\xB5\x13\xED\x92\x20\x7F\xC8\x79\x3E\x8F\xBD\x86\xC2\x63\x2C\xB2\x17\xC9\x78\xF5\x7D\x80\x88\x2B\x6A\xAF\x49\x5F\x82\x2C\x70\x1F\x44\x99\x8C\x02\x22\x8D\x91\x78\x06\x07\xA2\x82\x08\x29\x28\xA4\x94\x55\x7A\x16\x96\xE8\x24\x46\x9C\x9F\x9A\x01\x82\x1B\xC7\x6C\x33\x95\x1F\x83\xB1\x8F\x46\x9B\x48\x96\xD4\x58\xF5\x0A\x50\x76\x7E\x1D\x96\xCD\x87\x52\x96\xAF\x67\x49\x8D\xCF\x65\x7C\x4B\x8F\x66\x6A\xAA\x65\x0D", "\x31\xA7\x80\x00\x33\x29\x8B\x65\x75\x95\x5B\x7B\xA5\x66\xEA\x8D\x26\x98\x95\x46\xA0\x7B\x94\x06\x62\xA8\x9A\xCD\x87\x8A\x82\x2C\x62\x75\x19\x46\x14\x2D\x8F\x4A\xB3\x8E\x97\x65\x0D\x3A\xA8\x80\x00\x0C\x2A\xAF\x83\x01\x76\x2F\x67\xC0\x73\x8B\x62\xD5\x85\xD5\x7E\x29\xE3\x65\x20\x4F\x86\x76\xDE\x8F\x25\x0B\xB0\x9B\x3D\x8D\x2C\xBB\x8F\x47\x8D\x24\x8F\xBD\x93\xF7\x8C\xAA\x82\xE9\x13\x2D\xAF\x95\xC1\x8E\x7F\x67\xBF\x96\xF3\x15\x04\x16\xA1\x05\x1F\xEB\x11\x53\x8C\xE3\x56\xAE\x90\x5C\x85\x19\x9C\x55\xB9\x08\x09\x96\xEE\x29\xB6\x98\xE2\x02\x08\x0F\xD6\x8B\x6C\xBA\x77\x12\x96\x06\x02\xC8\x9A\xEE\x8B\xB1\x95\xD7\x99\xF3\x37\x35\xE4\x0E\x40\x97\x48\x34\xDB\x78\x5A\x84\x29\x19\x2C\x57\x24\x21\x96\xDD\x41\x91\x97\x69\x35\x64\x9E\xD9\x9A\x36\x20\x36\x86\x51\xAE\x31\x95\x95\xB7\x83\xB0\x9A\x8A\x65\x6C\xAF\x2C\xF7\x05\x6E\x87\xD2\x86\x2E\x95\x7C\x93\x03\x05\x6A\xA8\x22\xFE\x97\xF3\x97\x56\x93\xFA\x96\xA1\x41\x8B\x8B\x62\xAA\x31\xD7\x98\x6D\x90\x49\x92\xBD\x31\x17\x95\xC7\x9A\x6D\x9F\x22\xBC\x9B\x82\x98\x21\x76\x62\x84\x7F\x92\xDB\x91\x63\x89\x30\xEF\x2C\x63\x98\x83\x01\x74\x99\x39\x38\xC8\x8A\x64\x8C\x86\x18\x98\x32\x98\x51\x9A\xF5\x95\x9A\x2E\xC6\x87\x64\x95\x32\x9C\x88\x79\x2C\x3A\x99\x76\x99\x93\x90\x43\x9B\x6E\xA2\x00\x7A\x98\x6F\x99\xEF\x98\x12\x95\x33\x51\xCA\x84\x6F\xAD\x20\xCA\x9B\xDC\x9A\x43\x98\x53\x35\xBA\x94\x85\x8C\x64\xAB\x22\xC9\x9B\x92\x86\x49\x9A\x7C\x9F\x2E\x34\xDF\x94\x5F\xB0\xD5\x6D\x9B\x40\x98\x13\x98\x27\x9F\x89\x99\xDE\x9F\x64\xBE\x37\xA2\x00\x53\x98\x4C\x99\x80\x9F\x91\x9C\xC6\x98\x8D\x31\x36\xFB\x2F\xCF\x43\x1A\x03\x2B\x42\x81\x92\xC0\x88\x83\x36\x21\xD3\x43\x06\x99\xFE\x94\x1C\x06\x06\x0E\x52\x56\x01\x3A\x77\x25\x8F\x70\x14\x65\x5A\x0D\x03\x10\x95\x03\x18\x12\x63\x38\xB1\x5A\x36\x01\xDE\x84\x53\x26\x17\x9D\xC7\x98\x6F\x9D\x22\xA8\x4A\x58\x00\xA0\x7F\xEA\x39\xDC\x5C\xE1\x84\x77\x5E\x38\xF4\x77\x27\x03\xFB\x74\x25\x37\xC4\x94\xA3\x29\x71\x8D\x0F\xAB\x9C\x99\x34\x17\x9B\x82\x9B\x94\x9C\xC6\x91\x71\x90\x9B\x66\x93\xEC\x91\x68\x9A\x77\x51\x28\x99\x53\x93\x01\x16\x33\x82\x02\xD8\x98\x26\x9E\x97\x2A\xBD\x13\xD6\x86\x40\x62\x33\x81\x77\x93\x95\x2B\x9E\x47\x84\x9C\x98\x8F\x93\x7A\x42\x2A\xE8\x99\xEA\x98\x97\x8E\x6D\x7A\xC5\x81\x4D\x74\x50\x8B\x25\x92\x8B\x10\x57\x79\x99\x80\x1D\x9E\x92\xDC\x68\x4D\x96\x77\x44\x66\xF7\x4C\x7D\x99\xA8\x2C\x9F\x9C\xE5\x7E\x67\x81\x16\x85\x8B\x9D\x7B\x7D\x7E\x18\x6C\xB3\x95\xB9\x4D\x6C\x91\x0B\xBA\x39\xF5\x94\x60\x1F\x5C\x9E\x71\x55\xD9\x93\x2D\x2E\x2A\x98\x9B\x79\x9B\x58\x97\x5E\x9F\xF3\x1E\xD7\x95\x55\x94\xDC\x38\x95\xAB\x9B\x5B\x84\x65\x82\x68\x5D\xAB\x8F\x3E\x86\xCA\x3A\x57\x8C\x9A\x79\x96\xAC\x82\x08\x0D\x86\x38\x02\x2B\x40\x1E\x9D\x13\x96\xCA\x98\x7C\x86\x6C\x91\x79\x95\xD6\x7F\xA2\x24\x9B\xB0\x82\xD3\x99\xCA\x96\xB5\x24\xB2\x94\x5C\x66\x2C\xB7\x57\xAA\x9D\x7B\x06\xCA\x92\x73\x5D\xB2\x84\x6C\x96\xAD\x0A\x79\xB0\x9B\x8D\x4B\xA6\x9D\xD0\x90\x13\x07\x74\xA5\x74\x09\x9D\x6D\x56\x8E\x94\xAA\x9F\x63\x98\xEB\x80\xF2\x2C\x3A\xA7\x9D\xAE\x9D\xD2\x98\xCA\x92\xD6\x9B\x96\x2A\x6D\xBA\xAE\x2E\x96\xB1\x9C\x19\x07\x83\x9A\x9E\x41\xE1\x8F\x6E\xB3\x00\x51\x9B\x03\x03\xE9\x98\x08\x9A\xBD\x98\x82\x9E\x4C\x77\x37\xDA\x9B\xF0\x9B\x36\x9B\x0A\x9D\xC0\x96\xC4\x82\x61\x9C\x2F\xE8\x98\x59\x90\x26\x9B\xFB\x92\x92\x93\xEE\x9E\x6E\x86\x38\xAF\x98\xD6\x74\x12\x98\xB8\x99\xBF\x9F\x54\x37\x61\xA4\x3B\xD1\x98\x22\x99\x78\x9D\x71\x9B\xC8\x96\xDE\x93\x64\xB7\x3B\xF1\x98\x47\x98\x7D\x9F\x78\x9C\xDF\x91\xEE\x9D\x64\xBF\x3B\xAD\x9C\xCD\x87\x04\x9E\x43\x48\xDD\x9A\x86\x8C\x70\x88\xEA\x0E\x9C\xA4\x86\x08\x9F\x8E\x9D\xC3\x9F\x66\x31\x47\x94\x14\x22\x9C\x1F\x42\x1F\x9C\x78\x9D\x9A\x20\xE4\x85\x77\xAE\x37\xBF\x97\xE1\x9C\x23\x9F\xB4\x9B\x0F\x47\x3F\x56\x01\x2F\x82\x1E\x9C\x15\x9C\x27\x6A\x1D\x93\xC4\x99\xE1\x8D\x6E\x99\x04\x37\x00\x2E\x4B\x1B\x03\x87\x9F\x24\x02\x7E\x6E\x0B\x37\x00\x03\x91\x36\x00\x2C\x47\xCD\x99\xA6\x57\x03\x1D\x1D\x92\x1A\x19\x35\x1A\x9E\x82\x9C\xBD\x9F\x60\x69\x3C\x81\x77\x70\x3C\xE4\x5D\x32\x9E\x1C\x9D\xE9\x62\x99\x5B\xF3\x94\xD1\x3D\x3C\xCD\x87\x3F\x9F\x1E\x9E\x8B\x9A\x18\x94\xC8\x80\x43\x88\x39\xD3\x99\x4A\x9D\x75\x1D\x81\x97\xA9\x8E\xD0\x75\x01\x0F\x39\x81\x02\x51\x9C\x74\x9A\xFE\x73\xAC\x9B\x82\x5F\x66", "\x92\x2A\xED\x58\x2D\x38\x2D\x9F\xD6\x8D\x47\x98\x4C\x9F\x49\x80\xF0\x68\x99\x41\x30\xB5\x9C\x1D\x04\xBE\x32\xF7\x9A\xEF\x36\x47\x09\x02\x77\x9E\xA5\x91\x47\x7E\xA3\x34\x4D\x27\x24\x72\x3D\xC8\x8E\xE7\x67\x70\x71\x0F\x35\xF6\x88\xAD\x89\x64\x08\x89\x2B\x95\x2D\x9E\x89\x9D\xA4\x07\x1D\x72\x1F\x76\x07\x27\x04\x0E\x9F\x13\x96\x57\x86\x3E\x73\xF5\x8C\xE7\x92\x16\xB6\x23\x58\x41\x01\x72\x6B\x86\x72\x82\x1F\x1C\x90\x79\xA8\x29\xE3\x4E\x48\xF1\x97\x48\x06\xE4\x9B\x3B\x81\x2B\x98\x57\x82\xE4\x69\x41\x99\x9F\x5C\x84\xF1\x54\x5B\x8C\xF9\x87\xC7\x4D\xE4\x72\x82\xEA\x70\xC9\x91\xC4\x9C\xDA\x9E\x8C\x6C\x7C\xB8\x00\x28\x00\x2B\x20\xDC\x9D\xE4\x9B\x59\x8F\xBA\x4F\x15\x94\x3E\xA9\x9F\x91\x56\xCC\x9F\xA8\x93\x5B\x80\x8E\x7B\x74\x84\x3F\xDD\x61\xAD\x9E\xE4\x54\x3A\x72\x2E\x82\x2E\x82\xC7\x17\xE3\x51\x4C\xF8\x71\x66\x87\xCD\x5C\x1F\x76\xFA\x9A\x7C\x99\x13\x95\x9F\xC4\x9F\x6C\x86\x65\x06\x20\x7A\xFA\x97\x16\xB9\x02\xC9\x9F\xBE\x84\x5B\x9C\x09\x88\xA1\x2E\xE7\x9D\x6C\xB4\x01\x50\x80\xA8\x9C\xE0\x43\x49\x04\x36\x21\xEA\x98\x49\x1A\xF7\x07\x49\x1D\x97\x68\x9D\x8C\x44\xC6\x94\xF1\x93\x01\x16\x3C\xEE\x09\x18\x9E\x14\x9E\x8A\x9F\xA4\x6E\x50\x42\x72\xBE\x36\xC1\x98\xB5\x90\x11\x02\xC8\x9B\xF6\x94\xF2\x8F\x0E\x47\x3D\xF2\x86\x94\x30\x99\x9E\x0C\x07\xFE\x9A\xE3\x96\x79\x9F\x84\x4F\x9E\x1B\x9F\xF2\x37\x7E\x62\xEA\x93\xEF\x8F\x71\x86\x0F\x93\xA0\x2B\x4A\x19\x67\x0D\x07\x15\x42\xF3\x89\x79\xA2\xD1\x76\x90\x37\x9F\xC4\x9C\xED\x9E\x2D\x08\x03\x0E\x29\x78\x00\x7A\x3B\xC8\x5C\x00\x01\xE5\x2C\x12\x38\x03\x03\x44\xB7\x00\x58\x44\x2D\xA1\x98\x58\x0E\x05\x77\x80\xF4\x69\x80\x93\x3D\xCB\x97\x58\x99\x1A\x8B\x8C\x9F\x42\x75\x02\xA4\x77\x67\x40\xB4\x00\x60\x86\x45\x1A\x32\x59\x06\xA4\xA3\x33\x81\x8D\x0F\xB5\xA0\x36\x9F\x1B\xA2\x0C\x8C\x90\x9A\x03\xB7\x7A\x9A\x33\xD9\x9E\x39\x48\xAC\x98\x3A\x9A\x3E\x6F\xF5\x80\x00\x21\x3D\xD0\x99\x63\x9F\x28\x6D\x73\x8B\xEF\x9C\x93\x9C\x53\x9B\x41\xF6\x1A\xE0\x98\xC3\x76\x9B\x4F\x9A\x61\x9E\x80\x34\x9E\x23\xD4\x02\x71\x9E\xB3\x9D\x41\x1D\x46\x82\x10\x17\x11\xB5\x3D\xBB\x84\x27\x02\x1F\x85\x36\x9E\x3E\x1E\xCC\x99\x1F\x52\x39\xD2\x99\x4F\xA1\x8B\x3B\x59\x85\x3E\x68\x81\x52\x72\x99\x41\xE5\x6C\x72\x9F\x61\x55\x49\x83\x0E\xA7\xF6\x83\x49\xA3\x41\x81\x95\x22\x7A\x74\x98\xA6\x89\xC9\x9F\x07\xB6\x69\x82\xDB\x12\x80\x61\xA1\x5D\x37\xB7\x4F\x0B\xA7\x4B\x11\x84\x9C\x39\xE0\x8E\x5F\x9C\x68\x99\xA9\x84\xF1\x99\x03\x0F\x00\x2B\x40\x1E\xA1\xBB\x9F\xDF\x4E\xF4\x9E\x5F\x64\xFD\x9B\x3D\x82\xE4\x5A\x9F\xB8\x85\x71\x73\xF7\x9E\x5B\x83\x28\x13\x74\x93\x27\xBA\x9D\xF6\x70\xE8\x9C\xB3\x86\xF7\x9E\x2C\x83\x6D\x95\x3F\xDD\x9F\x00\x73\xE1\x9E\xF5\x98\x5B\x85\xFA\x94\x58\x87\x3F\xC3\x3C\xE0\x9E\x37\x6F\xAE\x95\xF9\x9E\x4E\x25\x7F\x92\x0A\x16\x02\x41\x31\xF8\x9E\x94\x64\xB6\x86\x61\x67\x7C\x89\x3B\x90\x4B\x4C\x95\xFC\x50\xA6\x9E\x18\xAC\xE9\x94\x01\x20\x3A\x86\x02\xD7\xA1\xC9\x99\xF0\x54\xD7\x9F\xDB\x22\x22\xA6\x3A\xBD\xA1\x88\x07\x57\x9F\x67\x99\x65\x9D\xE2\x2D\x75\xB7\x0A\xE2\xA1\xF2\x9F\x6E\x41\x6A\x9C\xD6\x9A\x7C\x82\x7F\x96\x06\xA7\x9B\xCE\x9F\x82\x70\x37\xA6\xD7\x93\x1F\x9F\x86\xBC\x39\xE8\xA1\xCB\x9C\x63\x9C\x6D\x4E\x1C\xA1\x0E\xAA\x76\x85\x3B\xDC\x3C\xEB\xA0\xC1\x99\xAD\x9D\xB5\x97\xEB\x98\x48\x39\x3A\x99\xA0\x1A\x9D\x03\xA3\xA4\x2E\x00\xAD\x86\x2C\x80\x8C\x3D\x8F\xA0\x3E\x9F\xFD\x62\x43\x49\xE8\x9F\xFF\x82\x70\x88\xEA\x60\x90\xE1\x5D\x1E\xA0\x02\xA4\x04\xAF\x66\x21\x82\xBC\xD1\x2C\xA0\x1F\x42\x23\xA1\x04\xA0\x09\xAF\xF2\x8A\x82\xAB\x3B\xE5\x51\xCC\x9A\xC5\x9D\x46\x00\x07\x0F\x0A\x47\x81\x9E\x40\x84\x25\xA7\x76\x90\xA2\x08\xA5\x00\xA4\x89\x39\x01\x2E\x94\x39\x00\x19\x55\x93\x01\xE3\x4E\x2D\x09\x03\x03\x44\xB8\x00\x58\x44\x3D\xA3\x98\x59\x0E\x05\x77\x8F\x03\x10\x00\x6C\x40\xA6\xA2\x35\x99\xA7\x2B\x3B\x34\xE4\x15\x2B\x15\x6C\x00\xB4\x78\x5C\x1A\x9C\x9B\xA0\xB9\x58\x27\xA4\x03\x16\x99\x09\x04\x56\xA2\x5F\x43\xA0\xA0\x8D\x33\x28\xAD\x3C\x85\x8A\x99\x6A\x22\xA2\x42\x9F\x50\x5D\x00\xA3\x29\xA0\x26\x0D\x8A\x95\x04\x00\x94\x76\xA0\x74\x98\x1E\xA1\x97\x0B\xC5\x35\x82\x97\x41\xDC\x9E\xDB\x99\x7A\x92\x45\x79\x56\x9E\xCD\x84\xFF\x56\x42\xFC\x94\xB9\x2D\x40\xA2\xCB\x72\x60\x4D\xE5\x8A\x97\x71\x19\xE7\xA0\x65\x01\x52\x87\x17\x37\x6F\x5F\x12\xA4\x24\x0E\x43\xED\x00", "\xA1\x95\x4B\x9F\xA6\x9C\x1A\xAA\xCB\x30\x6C\x83\x04\x12\x9B\x7C\x9D\x8A\x97\xA8\x99\x6F\x9F\xB3\x80\x76\xA9\x76\x42\x9D\xCF\xA0\x62\x9E\x41\xA6\xD8\x92\xDA\x80\x87\xAE\x3F\xA9\x9D\xF9\xA0\x80\xA0\x7B\x35\x60\x96\x19\x0E\x85\xAF\x43\xB0\x96\x04\xA0\xE0\x08\x0B\xA6\x04\xAF\x35\x87\x09\x1F\x44\xA4\xA0\x21\xA2\x1A\xA2\x5E\x2E\xA1\x40\x01\xA1\x8B\x94\x0F\x87\x4A\x3A\xA1\x70\x5E\x54\xA3\x23\xA9\x11\x18\x89\xB2\x00\x58\xA2\x03\x02\xAC\xA1\x72\x32\x2B\xA5\x13\xB4\x42\x9E\x45\xC5\xA0\x48\xA2\xE0\x9B\x41\x4C\x2C\xA0\x97\x0E\x8A\xA3\x3C\xAA\xA3\x3C\xA3\x57\x40\x4E\xA5\x30\xA2\x10\x16\x43\xBD\x44\xC4\x2F\x2E\x55\x61\x5C\x0C\x06\xB3\x3A\x1D\xBA\xEF\x3E\x51\x09\x02\xDF\xA2\x75\x5E\x96\x45\xD9\x59\x03\x0F\x76\x5A\x89\x45\xA3\x12\x58\x61\x6B\x5F\x7E\x28\xA3\xA2\x60\x29\x79\x13\xD7\x3B\xED\xA2\xBC\x93\x5F\x4C\xA1\x3B\x8E\x39\x8E\xA2\xBB\x5B\xA3\xB8\x4F\xEE\xA2\x0C\x06\x9E\x72\x10\x18\xE7\x6C\xE8\x67\xA3\x3C\xA3\x85\x6A\x7A\xA1\x46\x49\x72\x2C\x77\x6E\x47\xF0\x92\x7F\x4A\xF8\xA2\x76\xA2\x3E\xA9\xC4\x74\x8F\x84\x30\x70\x95\x9B\x9D\xC1\x9F\xA6\x99\x8C\x8C\x5A\x91\x8C\xB8\x21\xEC\x5C\x80\x04\xCF\x3B\xDF\x52\xEC\x27\x2C\x82\x08\x09\x0B\xA2\x9F\xBC\x9F\x7C\x70\xE9\x98\xFB\x96\xFD\x88\x85\x96\x3E\xDE\x9F\xA8\x9E\xE3\x9F\x2E\xA3\x15\xA6\x8E\x6A\x7E\xAF\x3E\xE1\x85\xCC\x57\xD4\xA2\xED\x4D\x37\xA7\x13\xAD\xC3\x00\x47\x82\x02\xC2\xA3\x9A\xA3\x47\x44\x2B\xAD\x8A\x9E\x8A\x8E\x94\x60\xA2\x15\xA2\x87\x9C\x21\x9C\x39\xA6\x16\xA0\x68\x76\x47\xE2\x2E\x50\x81\xEE\xA1\xCA\x8B\x51\x16\x87\x82\xBB\x02\x17\xCF\x67\xFF\xA2\xEE\xA3\x7D\xA7\xA2\x3C\x1F\xA1\x08\x3E\x47\xED\xA3\x3B\xA4\x01\xA5\x5E\x03\x98\x6B\x40\x4C\x8F\x8B\x48\xC7\x78\x08\xA5\x88\x00\x39\x91\x3E\xA5\x97\x9A\x2B\x4E\x48\x95\x0D\x47\xA4\xFC\xA1\x71\x8F\x3F\xAB\xC5\x35\x92\x80\x00\x57\xA4\xDA\xA3\x2C\xA5\x7A\xA3\x4B\xAB\x1E\xBD\xD1\x47\x48\xC6\x04\x03\x3A\x05\xA7\x7D\xA4\x41\xA3\x4E\x27\x93\x95\x64\x47\xA4\x31\x00\x29\xA7\x5B\x41\x27\xAC\x89\x2A\x76\x6B\xBB\x4D\x5D\x62\x2F\x67\x5F\xBA\x5F\x3F\xA7\xC4\x9D\xD1\x51\x20\xE9\x9D\xBF\x9A\x36\x99\x10\x05\x2F\x0B\x5F\x7E\xFB\x00\x4A\x82\xA5\xFC\x73\x91\x25\x42\x02\x53\xAA\xEE\x4B\x94\xA4\x49\x91\xA0\x3D\x99\xB7\x41\x72\xA2\x52\xA4\x29\xA6\x92\x9E\x9E\x5A\xA3\x82\xA5\x37\x5F\x0C\x06\x4D\xA0\x27\xB7\x8F\xB2\x49\x99\x83\x68\x14\x5B\x36\x7B\x28\x02\x97\x27\xB7\x2F\xB8\xA0\x1F\xA5\xF3\x7D\x06\xA4\x2C\x6E\x62\x10\x25\xAD\x8F\xA9\x4A\xBA\x39\xAC\xA4\x65\x5C\x80\xA5\x37\xAA\x25\xB1\x95\x95\xB5\x5E\xA4\x7B\xA4\x30\xA4\x9E\xA2\xAF\x48\x30\x86\x90\xBC\x49\xB0\x78\xBC\xA4\x02\x7B\x73\x47\x2D\x49\x24\xA2\x77\x51\xE8\x65\x8A\x79\x02\x05\x78\x85\x75\x42\x73\xC0\x77\x13\xBB\xE7\x01\xA5\xF9\xA2\x6B\xA7\x45\x3C\x53\xA3\x10\x1C\x94\x9B\x4B\x81\x74\x20\x4A\x5E\x91\xA8\xA7\x51\xAD\xF0\x84\x72\x97\x44\xA5\xA5\x4B\x64\xB2\x4D\xF3\x5E\x8A\x06\xAE\x3A\xEF\x2B\xC0\x49\x33\x2A\x65\x48\x83\xB0\x5C\x44\x77\x29\xA1\x97\x83\x4A\xB3\x00\xE4\xA4\x81\x02\xB9\xA4\x45\x7E\x29\xBF\x92\xAD\x22\x82\x9E\xD6\xA5\x51\xA7\xBB\xA6\x23\x05\x29\xBD\x0C\xB0\xB2\x1B\x34\x9B\x47\x0E\x36\x45\x02\x95\x20\x31\xB1\x86\x52\x4C\xEC\x99\x10\x27\x84\x01\xC6\xA7\xED\x47\x0D\x63\xEF\x68\x66\x1C\x10\x1C\x8E\x86\x87\x01\x30\x9E\x6C\x6B\x56\x4F\x28\x9D\x1D\xA6\x8C\x02\x8A\xA4\xCA\xA0\xE0\x74\x03\x1B\x98\x83\x04\x1B\xA6\xDD\x3D\x95\xA6\x85\x78\x9E\x3B\x60\x34\x3C\x68\x66\x04\x2C\x24\xA6\xD2\x46\x7D\x10\x08\x09\xAC\x7A\xD6\x42\x0D\x4B\x75\x60\x5F\x66\x77\x0C\x07\x59\x72\x20\x01\x04\x53\xEB\x7D\x9E\xF6\xA1\x9B\xA7\x40\x31\x5B\x71\x34\xBE\x29\x0A\xEF\x5A\x9E\x19\x6A\x10\x67\x70\x07\x5B\x72\x35\xAC\xCB\x6F\x85\x3B\x01\x27\x02\xAC\xA7\x61\x90\x89\x89\x49\x55\xA6\x14\x91\x4A\x63\xD6\x89\x34\x76\x07\x39\x40\x68\x33\x46\xD7\x71\x92\x2E\x66\xEF\x52\x6A\x48\x1E\x4C\x96\x96\x41\x9E\xE0\x3E\x91\x32\x16\xF7\x53\xF0\x5E\x02\x61\x9E\x56\x7E\x96\x7B\x74\x00\x38\x45\x03\x02\x5C\x45\xE9\x5E\x10\x64\xAA\x28\xB4\x16\x2E\xF3\x13\xF4\x5F\x13\x46\x0C\x05\x06\x07\x0B\x07\x09\x05\x4E\xC6\x86\xE5\x35\x65\x46\x60\x83\x08\x4F\x08\x71\x16\x66\x30\x56\x42\xE8\x63\xBB\x63\x52\x65\x15\x9E\x14\x6E\xCF\x0F\x86\x22\x30\xE5\x9B\x70\x9D\x6B\x07\x2A\x6E\x30\xA1\x66\x71\xB2\x75\xA6\xD2\x5F\x1C\x03\xD4\x45\x5F\x05\x9D\x6B\x66\x7A\xD6\x3E\x08\xCE\x65\x7F\x66", "\xEA\x5D\x15\x68\xFC\x57\x77\x4A\xBF\x7C\x43\xB0\x5E\xA6\x2B\x2C\x67\xF3\x51\x38\x45\xCF\x1D\x27\xAA\x38\x5C\x47\xC0\x9A\xA7\x3C\x17\x62\x9F\x3D\x1B\x40\x68\x2E\x61\xAE\xA7\x64\x60\xF1\x5E\x17\x6F\x3B\xAD\x9D\x88\xC3\x42\x61\xCA\x60\xFF\x3D\x82\x31\x01\x6E\x39\xAB\x80\x57\x2E\xD1\x73\x34\x00\x01\x03\x0A\x22\x7A\xA8\x38\xB6\x0B\x73\xC4\x45\x80\x3C\x95\x5E\x0F\x20\xA0\x24\x96\x33\x94\x0A\x5C\x4D\xA6\x47\x91\xA7\xD9\x73\x54\x5C\x94\x56\x09\x74\x89\x59\x4F\xAD\x2B\x93\xA0\x1D\x8F\xB3\x8D\x95\x55\x15\x4C\x9E\x95\xB3\x1F\xA7\xCF\xA6\xC1\x41\x0D\x01\xFF\x57\x12\x1C\x7F\x6E\xC3\x49\x63\xA1\x73\xDD\x5E\x1D\x87\xB3\x6E\x1C\x65\x65\x50\xC7\x13\x39\x1E\x61\x79\xA7\x8C\xA3\xFC\x50\x38\xBC\x18\x75\x00\x0F\x60\x27\x03\x08\x60\x75\x61\x87\x37\xC2\x39\x9F\x82\xC7\x7B\xA7\x23\x63\x6B\x4B\x76\x64\x03\x65\x42\x5E\x8E\x5B\xB5\x3E\x86\xC3\x58\x92\x87\x89\x46\x06\x00\x03\x1E\x2B\x09\x04\x1E\xA8\x30\x49\x31\x39\x39\x44\x05\x76\x93\x97\x69\xA0\xD6\x28\x4D\xA8\x96\x9C\x99\x12\x80\x8B\x8C\xA3\x25\x9B\x92\xC0\x23\xA8\x9D\x6C\xDA\x44\xF6\xA0\xD4\x65\x68\x29\x9F\x9C\x4F\xB3\x42\x19\x65\x1D\x37\x31\x42\xFE\x54\x2F\xAE\x9E\x85\x50\x8A\x47\x37\x01\xD1\xA6\xF0\x05\x74\xAB\xC4\x2A\x85\x50\x67\x32\x61\xAC\xA6\x60\x61\xF0\xA0\x79\xA0\x3B\xA8\xA2\x93\x67\x03\x5F\xB4\x5E\x26\xAA\x4F\x6A\x53\x39\x0B\x64\x88\x79\x05\x59\x46\xBD\x61\x52\x34\xF0\x5C\xF0\x52\x3C\xB6\xDC\x04\xC3\x3B\x33\xC6\x60\xDA\xA6\xDA\x42\x8A\xA0\x73\x46\xCE\x02\x50\xCF\x5F\x19\xA8\xD0\xA5\xC9\x81\x07\x08\x32\x83\x08\x2A\x0C\x9B\x73\xEE\x8F\xCF\x95\x46\x66\x03\x3E\x40\xA7\xE3\x43\x70\x26\x97\xF8\x8F\x1D\x95\xEA\x96\x10\xA7\x12\x6A\x60\x39\x0C\xC8\x73\x9D\x70\x9E\x85\x6C\x75\xCA\x54\xF7\x4A\xA3\xA7\x88\x37\x00\x33\x00\x4F\x03\x0A\x22\x91\xA5\x3D\xBE\x5C\xAD\x0C\xF3\xA8\x60\x35\x6A\x8A\x70\x67\x23\x6F\x34\x85\xCD\x5B\x4F\xF9\xA8\xDD\xA7\x47\x5A\x1F\xAD\x75\x90\x48\xBB\x19\x90\xC4\x30\x73\x12\x62\xD9\x73\xD1\x83\x72\xA9\x34\x85\x09\x52\x52\xF6\xA8\xA5\x97\x4A\xA9\xCD\x86\x86\xA8\x49\xB8\xA1\x8A\xC4\x55\x86\x9D\x90\xD7\x94\x46\x42\x23\x4D\x33\x93\x9B\x84\x50\xFF\x19\x81\xA6\x2D\x5B\x0D\x04\x06\x0A\x7E\x83\x08\x2C\x1F\xF0\xA8\x48\x87\xF7\x8C\x24\xAC\xB7\x62\xBA\x97\xE8\x5B\x23\xE9\x74\x78\xA9\x37\x5B\xA4\x95\x66\x8E\x4A\xBE\x3F\xB7\x46\xB2\xA9\xF7\x5C\xD8\x94\x73\x73\x90\xAE\x9C\x69\xA3\xB1\x4F\x9F\x43\x37\x00\x1B\x00\x31\x03\x05\x2B\x4D\xAD\xA4\xAC\x0C\x9F\x48\xA0\x96\x8D\x61\x31\xAC\x2E\xA7\x4C\xA3\xCD\x09\x53\xFB\xA8\x73\x01\x4B\xAA\x32\xAA\x75\x94\x13\x5B\xA4\xB1\x52\x9D\xA9\xAF\x97\xE5\x72\x4F\x41\x7C\xA3\x4A\xBA\x8A\x77\x85\x42\xA9\x9F\x72\x30\x37\x38\xAD\x6D\x57\x4A\xAE\xE5\x54\x52\x87\x59\x52\x86\xF4\xA5\x0A\xAA\x7F\xA0\xA8\x8D\xA7\x92\x30\x6F\xA9\x58\x87\xE4\x72\x34\xAC\x23\x4D\x4B\x36\x16\x13\x74\x28\x60\xD8\xA4\x31\x8B\x6F\x88\x5F\xA6\x44\x58\x2D\xA0\xE0\x00\xA3\xF1\x76\x96\x93\x02\xA1\xC7\x93\x8F\x82\x26\x99\x41\xBD\x7C\xE4\x90\xD0\x93\x2F\x7A\x98\x80\x96\x9C\x2E\x90\xF0\x34\x00\x06\x9B\x5A\x2D\x78\x88\xAC\x47\xAB\x29\x4B\xAB\x2B\xA4\xA8\x71\x85\x77\x3B\xBA\x78\x92\x94\x95\x80\xA5\x61\x49\xEF\x7D\x22\x01\x12\x79\x29\x6F\x84\x77\xD1\x83\xA7\x19\x34\xB9\xA5\xF8\x8A\xBD\x92\x47\x9A\x44\x90\x9C\x88\x65\xBF\x17\x92\x10\x07\x8C\xFF\x65\x2B\x9C\x9F\x61\x08\x4A\x4E\xA8\x55\x3D\x89\x33\xAB\x01\x82\x2D\x98\x30\xAE\xA1\x85\x26\x9D\x79\x60\x89\x97\x65\x72\x9A\xDF\x4E\x1C\x99\xC4\x68\x47\x86\x00\xA7\x99\x88\x92\xF8\x0E\x34\x96\xAD\x81\x03\x07\x4E\x81\x04\x49\x93\xB1\x98\x0B\x7D\x1F\x7B\x31\x9D\x26\x8A\x4D\x99\x54\x2C\x93\xD2\x92\xD7\x91\x4C\x6A\x7A\x34\x99\x92\x4D\x98\x27\xB4\x93\xDB\x93\xCD\x93\x74\x58\x37\x94\x9B\x03\x00\x94\x35\xD9\x7E\xAE\x13\x12\x8C\x47\x8D\xB0\x68\x62\x98\xA3\x76\x00\x6A\x1E\xE6\x49\xAF\x65\x8B\x8D\xFF\x6F\x62\x9C\xE6\x7F\x74\x5E\x79\xC0\x26\xBA\x6A\x8D\x8B\x9C\x78\x7D\x13\xFB\x4E\x1B\xCC\x0F\xEA\xA8\x1A\xAB\xC2\x72\x9D\x7A\x48\x4C\xE7\x63\x26\xCB\x79\xA5\x7A\xB4\x7C\x34\x82\xED\x7F\x58\xB9\x25\x74\x18\xF0\x7E\x77\x6A\xCB\xAA\xFA\xA3\xB6\x43\x50\xB5\xFB\x69\xF3\x25\x34\x3F\x8C\xEF\x0D\x03\x10\xA4\x96\x11\x03\x51\xB5\x1A\xEB\x67\x37\x01\x0E\x6E\x41\x02\xB7\xAA\x6B\x95\x01\xBC\x1A\xB7\x80\x32\x9B\x17\x95\x0A\x9F\xA5\x9C\x03\x84\x36\x9A\x24\xB3\x9A\xFF\x5F\x21\x82\x23\xA7\xB2\xA5", "\x65\x19\xAC\xAA\x50\xEB\xA7\x3C\x9A\x20\x94\x13\x87\xB3\xA7\xCC\x89\x69\xBF\x56\x94\x92\xC1\xAB\x1A\x94\x8C\x94\xB8\xA8\x91\x86\xAE\xAC\x34\x95\x63\x2E\x6D\x8E\x92\x6D\x31\x47\x97\x3E\xAB\x0A\xBC\x4F\xFA\x48\x56\x6C\xB5\x9A\x74\xAA\x99\x6C\xA6\x94\xED\x62\x39\xA8\x7A\x32\x00\x81\x7E\x40\x04\xE0\x7D\xEF\x66\xF8\x79\x15\x60\xA6\x1D\x48\x85\x7C\x4D\xA9\xC4\x86\xCE\x92\x58\x61\xF8\x7A\x9C\x30\xA2\xBC\x94\x56\x11\x58\x9C\xE9\x12\x8F\x44\x2B\xCC\x72\x02\xAD\xEA\x08\xB2\x94\x60\x8A\xAC\x87\x18\x8C\x2B\xCF\x38\xDF\x8E\xA5\xA6\x67\x13\x00\x82\xAD\x96\x50\x14\xA8\x74\x6F\x88\x4E\xFB\x6E\x0D\x00\x4D\x8D\x54\xBB\xBF\x7E\xF0\x29\x4F\x23\x55\xFF\x5A\x00\x70\xA4\xAE\x45\x6C\x51\x76\x2D\x72\x81\x8F\x77\x48\x6D\xEB\x13\xD2\x69\x0F\x93\x01\x14\x4F\x88\x1D\x18\x51\xC4\x76\x00\x50\xA6\xA6\x3E\xBA\xAC\x98\x56\xB4\x86\x3A\x9A\x57\xA9\xE2\x71\xEA\x40\x10\x9C\xB4\x66\x95\x32\xA8\x6B\x7B\x13\xA9\x0D\xAD\xB5\xA8\x5E\xA3\xB5\x40\xC8\x73\x81\x97\x8F\x49\x3E\x81\x86\xF9\x47\x03\x17\x18\x8A\x08\x92\x86\x0C\x85\x8A\x8E\xC7\x82\x88\x7C\x36\xA3\xD3\x29\x95\x12\x84\x22\x86\x2B\x39\xC5\xA2\x1A\x6A\x32\xB1\x98\x95\x8E\x0B\x70\x32\x00\x97\xA6\x55\x0D\x84\x52\x33\xBF\x08\x6A\x70\x35\xA6\xBD\x98\x09\xAF\x0F\x41\x67\xAF\x6A\x46\x99\x9A\x59\xB2\xA6\x95\x41\x2D\xAF\xC5\xA0\x49\x90\x6F\x71\x99\x9E\x59\xD8\x61\x2F\x60\x42\xA9\x0C\x62\x06\x08\x03\x0E\x1C\x46\x04\x7E\xAC\xA5\x5E\x74\x42\x5F\x30\x1A\x62\x0D\x68\x6B\x99\x8E\x56\x61\x77\xAC\x2C\x9F\x82\x3B\x1B\x69\x85\x69\x53\xA4\x8E\x67\xA8\xB9\xA8\x1F\x5E\x06\xAA\x8B\x52\x03\x19\x01\x3E\x59\x83\x02\x80\xAC\x77\x63\x83\x33\xD0\xA8\x68\xB6\x98\x9F\x59\xEB\x9E\x98\x47\x6A\x62\x84\x31\xD1\xAB\xE5\x9B\x2C\x42\x7A\x5C\x61\x8E\xAD\x57\x4F\xF4\x11\xD0\x4A\xF6\x41\xC2\x2A\xBD\x6C\x88\x22\x8A\x69\x76\xCF\xA0\x4C\x09\x67\xB5\xA6\x97\xB3\x13\xAD\x9C\x58\xE5\x52\x10\xAF\xD1\x04\x44\xB8\x7E\x5A\xC2\x33\xAD\x83\x2D\x60\x1D\x58\x33\x10\xAB\x09\x66\xEF\x6A\x8C\x2E\x31\xA2\x61\x7E\xAB\x89\x53\x38\x66\x0A\x6F\x8D\x4F\xB4\x74\xA9\x59\x32\x92\x46\x27\x66\x65\x49\x79\x30\x19\x66\x57\xAD\x38\xC5\xAD\x6A\xAE\x1A\x39\x8E\x39\x6C\xA5\xA7\x91\x34\xCD\xAD\x90\xAC\xF8\xA7\x0F\xAD\x19\x45\x03\x02\x9D\x9F\x8C\x3D\xAD\xBA\x44\x23\xAA\xCF\x5C\x15\x6F\x44\xA0\x9E\x88\x66\x79\x46\x52\xA8\x9C\x35\xEC\xA1\xF0\x5D\x6E\xA6\x9E\xB5\x4E\xE1\x46\x7B\xAA\xB7\x47\x7A\x30\x50\x6D\xFE\x5C\x9D\xB9\x68\x7F\x33\x50\xA9\x60\x62\xED\xA3\x18\x64\x3C\xA1\xB8\xB5\xC2\x03\xAE\xC9\xA6\x33\xA8\x0F\xAB\x80\xAF\x33\x83\xB7\x82\x85\x32\x2E\x97\x6C\x00\x01\x28\x5E\x3A\x7A\x18\x45\x65\x73\x50\xCF\xAB\x82\x77\x67\x97\x89\x50\x27\x63\xAC\x2E\x9F\xB3\xBF\x62\xAD\xB8\xA8\x8E\x46\x0D\x04\x06\x0A\xFF\x42\x08\x36\x4F\x92\x60\xF8\xA6\xFA\x8C\x43\x42\x00\x6C\xBD\x84\x80\x7E\x4F\x88\x52\x00\xA8\x13\x4A\xDC\xA5\x79\xA4\x37\xB7\xA6\xBF\x86\x36\x00\xE7\x53\x04\xA8\xE7\x92\x8F\x3C\x40\xB2\x4A\x81\x54\xC4\x4F\xF0\x39\x09\xAA\x2A\x45\x03\x62\x73\xB7\xA0\xB6\x52\x8D\xAE\x21\xAE\xC5\x44\x0E\x06\x16\x43\x10\x18\x05\x6E\xC3\x30\xA8\x3F\xAD\x12\xA8\xDD\x7D\xC8\xA3\x37\x6B\xAD\x85\x54\xB9\xA8\xA7\x17\x85\xAC\x1A\xAF\xD6\xA6\x48\xBA\xA5\xB1\x00\x0C\xA9\x06\x02\xB0\xAD\xFB\x89\x98\xA2\x47\xB9\xA7\x99\xF8\x5E\xAD\x4E\x87\x43\x5A\xC6\xA9\x91\x58\xF6\x9A\x3F\x8B\x5B\xFC\x8F\xA9\x72\x58\xAB\x33\xA8\x9E\xA3\x4B\xB1\x88\x7F\xC3\x7B\x58\x45\x5D\x6F\xAA\x94\x29\x9C\xA4\x47\xAA\xB9\xB9\xC5\x6F\x34\xE7\xA9\xE5\x63\x11\x83\xED\xAB\x72\xBC\xA3\xAB\x2E\xA8\x62\x08\xAB\x00\x91\xCC\x62\x90\xA1\x4A\xBA\xB3\x95\xE6\x2E\x2F\x37\x01\x1A\x01\x37\xAE\x20\x03\x79\xA3\xBB\xA4\x52\xF8\xA9\xB7\x72\x62\xAA\xFC\x8E\x98\xA5\x65\xA0\xBC\x83\xC4\x04\xAF\x1E\x48\x2F\xA3\xCC\x85\x99\xA2\x77\xB8\x81\x80\x20\x94\x02\x02\x91\x85\xA9\x6C\x70\xDA\xAD\x13\x78\xBC\x8A\x0D\x9B\xAF\xE4\xA9\xCE\xAF\xB9\x31\xF0\xA4\x50\xAD\xBB\xAD\x5C\x82\xAF\xEC\xA8\x4D\xAB\x41\xAB\xEE\xA9\x50\xAC\x89\x43\x20\xDB\x86\x12\x63\x75\x90\xD6\x99\xA3\xA9\xE4\x8D\x88\x9C\x54\x8E\x4B\x32\x92\x2A\x9E\xEC\xAD\x97\x92\x52\xA7\x00\x72\xEF\x25\xAA\xCD\x71\x6D\x3A\x0D\x01\xA5\xAD\x55\x48\x68\xA2\x17\x8A\x9A\x8C\xAA\x86\x9B\x5A\x97\xA1\x99\xD5\x79\x26\x60\x16\xA1\x78\x37\xAA\x7D\x88\x7C\x8C\xA7\xAB\xD1\x8F\xE2\x77\x25\xE5\xA4\x79\x92\x78\x6B\x50\xAC\x44\x00\x56\xBD\xF9\x4D", "\x20\x00\x93\x61\xAA\xFF\x64\x29\x7C\xA9\xAB\x35\xBC\x25\xB2\x27\xCB\xAF\x88\x61\x6E\x93\xC8\x7C\x21\x90\xA8\x02\x47\xBC\x32\xDA\xAA\xDD\x4A\xAE\xAB\x38\x2E\xAB\xA4\x9E\x94\x03\x2D\x5F\xDE\x05\x63\xAA\xC6\x88\xCE\x79\xA4\x6D\x54\xA9\xAB\x8B\x27\x8A\x8C\xA9\x4E\xB7\xA9\x39\x28\xAE\xA9\x96\x53\x30\xB0\x26\xF5\xAA\xDC\x92\x46\x79\x76\x95\x35\x99\x57\xB7\x4E\x92\xF2\x5E\x93\x1F\x8D\xBF\x78\x9C\x9D\xF9\xA0\x58\xBB\xE4\x66\xF4\x03\xAB\xC4\x79\xC2\xAA\x47\x69\x07\x0E\xCE\x8C\xAC\x52\xD5\x22\xAB\x90\x6A\xD2\xAA\xA4\x30\xB2\xAF\x3D\x3F\xE7\x60\x3E\x01\x7A\xA9\xAA\x11\x54\x73\xAE\xF6\xA0\x7A\xA1\xAD\x70\x56\xA3\x6B\x40\x8D\x8F\x9A\x0A\x87\xB6\xA4\x54\xA2\x2A\xA8\x34\x8B\x70\x39\x01\x92\x99\x40\x07\xA4\x94\x84\xB6\xAE\x80\x66\x3D\x8D\x2B\x9B\xEC\xA9\x4B\x9F\xA9\x21\xA3\x96\xDC\x31\x34\xC6\x8D\xC2\xAA\x8E\x90\x4D\x9A\xB9\xAC\x79\xB3\xBA\x97\x93\x7C\x55\x3D\xB1\x1B\x6D\x49\x92\xDA\x81\xA4\x92\xEE\x6D\x57\xD4\x7B\xEF\xAA\xA3\x91\x0D\x02\xBE\xA1\x10\x14\xAF\xA5\xD4\x07\x7E\x75\xA9\x6B\x4A\x7E\xA8\xF6\x48\x08\xB0\xD7\x7F\x57\x8D\x10\xD4\x95\x01\xAD\xA0\x48\x29\x78\x03\x07\xB0\x86\x2B\xD8\x12\x0B\xAD\x3E\x3F\xF6\x8E\xC1\xA0\x62\xB1\xC3\xA7\xA8\x51\x95\x1D\x59\xBC\x14\x85\x83\xE1\x84\xDE\x62\x1A\x35\xDF\x18\x54\x37\x00\x0E\xAC\x11\x4E\xC3\xAE\x52\xB7\x60\x6B\xE0\x31\xA8\x8F\x2B\x11\xAF\x4C\xAD\xC4\xA5\x27\x98\xBE\x68\x58\xCD\x82\x81\x66\xFA\x39\xE2\x72\x97\x31\x71\xB9\xB4\x7D\x58\xBD\x41\x17\xAE\x21\xAF\xAE\x63\x07\xB6\x78\xA4\xB5\x60\x62\xCE\x0C\x7F\xA7\xA4\xAC\xB9\xA8\x06\x07\x69\xA2\x08\x19\x5A\x92\x60\x82\xAC\x53\x32\x9C\xAF\xD3\xAF\xA7\x81\xB5\xBA\x62\xB2\xA6\xE3\x64\x46\xAE\x74\x49\xD5\xAF\x0D\x7A\xBA\x91\x5A\xD6\x5C\x36\xAE\x07\x44\x0D\x05\xF8\x64\xC2\x48\x9C\xA3\x8C\x44\x39\xD9\xAC\x61\xAC\xD0\x44\x8D\x30\x6C\xA0\x85\x48\x5B\xE8\x34\x04\x49\x4D\xB2\xCD\x46\xD9\xAB\x76\x15\x16\x71\x3A\x57\x78\xF6\x6E\x76\x8D\x3B\x0D\x05\x6F\x78\x44\x3C\x98\x50\xDC\xAE\xC9\xB1\x13\x45\x0D\x04\x19\xB9\x10\x14\x4C\x52\xC0\x3F\xAD\x4D\xA6\xA2\x46\xB1\xAB\x1A\xB0\xC4\x31\xC6\xA9\x65\x5C\xAD\x33\x6A\x98\x86\x36\xB3\x69\x47\x0A\x66\xBA\x9E\x4E\xBB\xB1\xD8\x60\x63\x98\x40\xB0\xA4\x81\xE7\x40\xA6\x34\x2E\x34\x29\x63\x73\x32\xAF\xC9\xA4\xD4\xA6\x11\x09\x29\xB2\x4C\xBF\x29\x0F\x03\x9F\x03\xFD\x13\x98\x23\x6A\xBE\xB4\xB8\x59\xBD\xA6\xF1\xB0\x30\x04\x7D\x3F\xD5\xA4\x24\x40\xA6\x13\x64\xB5\x29\xB2\xAD\x8C\xB1\x2E\x28\x23\xB1\xEB\x1D\xC1\x2F\x5A\xC0\x29\xAB\x12\x8A\xB3\xB4\x77\x88\x86\x2D\x0C\x83\x81\x04\x37\x84\xF1\x63\x8E\xB1\x44\xB4\x0E\x0B\x02\x68\xC8\xBC\xFC\x4B\x30\x2C\xB2\x79\x08\x81\x91\x6A\xAE\x20\x63\x16\x10\x64\xC6\x02\x73\x9F\x27\x10\x45\xB6\x05\x63\xF7\x46\x66\x83\x89\x05\xB2\x33\xB3\x83\xB0\x48\xB5\x45\x43\xF7\x4F\xA8\x8D\x83\x1E\xB2\x0F\x18\x8A\xB2\x3F\x31\xDC\x50\x03\x01\x0A\x6F\xB9\x32\xB2\x40\xB3\x59\x2B\x52\xB4\xA3\x44\x95\xAD\xA8\x8E\x89\x40\x29\xC9\x0E\xA9\xB2\x9D\x58\x3F\x71\x14\x57\x96\xB0\x52\x33\xB2\x5A\xB3\x26\xA6\x31\x2E\x41\x7E\x95\xA5\x77\x60\x65\xCD\x12\x62\xB2\x71\x5F\x5A\xB2\xC3\x92\x03\x01\x0A\x68\x0E\xC8\xB2\x59\xB3\xD2\x12\x4D\xB4\x01\x97\xA5\x6D\xCB\x9B\xE8\x6F\xB2\xC2\x28\x10\x03\xEA\x85\x75\x81\x14\x53\x43\xB8\x65\xB2\x29\x7A\xB3\xAD\xB1\x0E\x93\x2E\xBE\xF2\x83\x43\xAD\x65\xB0\x87\x80\xB2\xBE\x39\x5C\xB6\x76\x81\xEE\x54\x01\x01\x85\x01\x98\x87\xB2\x3A\x69\x62\xB4\x80\x9C\x98\xAA\x89\xBE\x30\xED\xB2\x7C\x91\xC8\xB2\x91\x51\x2E\xB2\x88\x81\x77\x75\x00\x41\x42\x14\x9D\xCC\xB1\x5A\xB4\xBA\x9D\x99\xA3\x81\xBD\x31\xED\xB2\x0A\x98\xD1\xB3\xC2\x89\x2E\xB3\x1D\x54\x71\x81\x85\x28\x9E\xAA\xB3\xCD\xB1\x72\x33\xC4\x94\xE3\x8D\xCB\x9E\x38\xB2\xB3\x1D\x70\x00\x01\x5C\xB4\x37\xB7\xA1\x77\x01\x01\x85\x1D\xA0\xB9\xB3\xA0\x1B\x5E\xB6\x01\xA6\xF4\x8D\xCB\xB2\x3C\xC0\xB3\x51\x0D\x80\x01\x5C\xB7\xE6\x99\x11\xA1\x0A\x6E\x44\xC9\xB3\x5E\x1D\xE5\xB3\x4A\xA5\x35\xB4\x13\xA4\x81\xAD\x65\xA7\xA0\xD0\xB2\xE3\x01\x5C\xB5\x05\xAA\x1B\xA1\x0A\x53\x47\xD8\xB3\x68\x20\xED\xB0\x1C\x05\x27\xAA\x1B\xAD\xCB\xB8\x44\xE1\xB3\xA1\x20\xC1\xB2\x8E\xA1\x4D\xA9\x15\x42\xBB\x3A\x03\xC0\x29\x6F\x14\xF5\xB2\x93\xA1\x4D\xA4\x7B\x9D\x8E\x80\x53\x5A\xB2\x14\x75\x60\x38\xA0\xA5\x3E\xB6\x96\xB4\x03\x38\x67\xFF\x10\xFA\xB3\x65\x5C\xA0\xA5\x3F\xB2\x2E\xBF\xCF\x89\x66\xE7\xA5\x6D", "\xB2\x4E\x0E\x90\x42\x95\x48\x95\xBF\x09\x29\x64\x8A\xB3\x73\x49\x08\xB4\x15\x0F\xA1\x34\x84\x20\xA6\x38\x23\x71\xB2\xEA\x48\xE1\xAF\x13\xA3\xDD\x6A\x4A\x95\xD0\xB4\x01\x17\xB4\xF1\x6D\xFC\x76\x88\xB1\x97\x03\xA2\x8A\x25\x9E\x68\xB3\x09\x14\xB2\xC0\xA2\x0F\x06\xD8\x74\x6B\x06\xC3\x08\xF0\x19\xB3\xF9\xB3\xA5\xB2\xD4\x4C\x46\xB6\x18\x1C\xF0\x38\x9C\x0E\xB4\xCA\xB2\xF9\xB2\xD4\x4B\x91\x6B\x7B\x29\x28\x99\x66\xAB\x12\x7B\xB3\x70\x3B\x22\x6F\xA5\x3B\xCD\x20\xA6\x11\x3A\x14\xB2\xE1\x39\x03\xB3\xF7\x0A\x13\x23\x10\x1A\x84\x09\x55\x84\xB2\x67\xB2\xA0\xB1\xF6\x13\x2F\xBA\x9C\x92\xD2\x8D\x20\x46\x99\xC4\x93\x9F\xB3\x4F\x07\x19\x13\x94\xAE\xC0\xA6\x18\x8D\x10\xAB\x3C\x92\x88\xC0\x7E\x44\xBF\x91\xA3\x29\xAD\xD0\x67\xB4\x39\x1C\xEF\x52\xD9\x7E\x7F\x68\x92\xB7\x1A\x14\x64\xF3\xB4\x6B\x69\x5E\x2A\x4A\x89\xCE\xA3\xCF\x77\xCF\xB3\x64\xA8\xB4\xF9\x78\x8E\x65\xF4\x1F\xA4\x87\xB3\x6F\xE8\x2A\x14\xE2\xB4\x74\x01\x0F\xB6\x7C\xB2\xA5\x8E\x03\x0E\x82\xB5\xD6\x1E\x89\x52\xA0\x03\x96\x9F\xB0\x28\xB4\xA6\xAB\xCA\xA4\x1A\x8E\xB5\x4A\x40\xBA\x9E\x80\x96\xC8\x80\x4C\x2C\x67\x31\x68\x9B\xB5\x3E\x01\x34\xA2\x5D\xA4\xB5\x20\x0C\x32\x36\x04\x42\x85\x1A\x93\xB5\x9F\x02\x44\x8A\x92\x2B\x97\xB2\x7B\xA1\x6A\xC6\x49\x72\x9E\x48\xB7\x85\x68\x12\xAC\x5A\x28\xD4\xBB\x64\xC2\xB3\xF2\xB2\x57\xB6\x13\xA1\x97\x02\xAB\xB9\x66\xAC\x45\xA6\xB4\x95\xB4\x66\x9A\x8C\xB3\x57\xBA\x65\x1A\xD4\x90\x33\x88\xB5\x9E\xB5\x5C\xB6\xD8\x9C\xB6\xA4\x07\x0B\xD5\x9B\x3D\xF3\x68\xA9\xB4\x3A\x01\xB2\xB2\x58\xB1\x3F\x6C\xD6\x85\x29\x91\x92\xB6\x68\x60\x2B\x7E\x17\x53\xB8\xAD\xB7\x51\x61\x15\xA2\xB5\xEB\x66\x13\xB6\xA2\xB4\x99\x9B\x46\x61\x2B\xB2\x14\xD9\xB5\x33\xB3\x90\x1C\xB7\xB0\x83\x65\xA8\x98\x68\x17\x6B\xEB\x9A\xCB\xA1\xCC\xB0\xA0\xB7\x5F\x7E\x25\x63\xD4\x96\xA8\x0F\x4B\xB6\xAB\xD7\x80\xA2\xB2\x51\xBD\x47\x60\xD8\x40\x35\xC4\x02\xE0\xB5\xCB\x15\xB4\xB3\x5C\xBD\x5A\x88\x2E\x7F\x6B\xEC\x00\x32\x8A\x34\x7C\x30\x2A\x5D\xBA\xAC\xB1\x95\x78\xEB\x5D\x1A\xC6\x98\xA3\x8D\xB4\xB2\x29\xBC\xCC\x96\xB6\x4F\x6C\xBD\x3C\x5F\x88\x23\x96\xEB\x28\x2A\xB1\xF3\x6B\xD7\xAF\x1C\xAD\x50\x3E\x01\x3C\xB1\x75\x09\x08\x37\xAD\x99\xCC\x84\x6C\x89\xAC\xB3\x0B\x90\xB6\xA1\x65\x28\x76\x86\x28\xCA\x4B\x6C\xED\x09\x14\xB3\x6D\x95\xA6\x91\x4B\x85\x06\x01\xC2\x1C\x2A\xA6\xB6\x30\xB5\xA5\xB0\x93\x83\x66\xBC\x11\x16\x5C\x26\x61\x5E\x6F\x2F\xB7\x15\x24\x45\xB4\x49\x87\x43\x84\xDC\x54\x69\x82\x02\x56\xB5\x5C\x76\x89\xB3\x4B\xBB\x94\xAD\x30\x45\x6D\xFE\x94\xC6\x99\x5C\x74\x30\x2D\x52\xB8\x61\x50\x98\x7E\x00\x7A\x5D\x43\x15\x6F\x95\xBF\x5E\x44\xBC\xB0\xB4\x9C\x4C\xCB\x58\xB6\xF7\x04\x55\x2B\x4C\x38\x98\x2B\x11\x34\xC8\xB9\x74\x17\xAC\x30\x47\x7B\x69\x38\xB1\x33\xBD\xB5\xA5\xEC\x0F\x9E\x68\xB6\x6A\x38\x55\x28\x60\x3C\x6C\xB6\x8B\x23\xCA\x8F\x9E\x08\x70\xE5\x92\x59\x41\xE8\x4E\x44\xB9\xA3\xB4\x02\xB7\xA8\x78\xB6\xFE\x7C\x79\x95\xE8\x48\x48\xB9\x9D\xB2\xCF\xA6\x9E\x71\x8D\x40\x03\x89\x3B\xBA\x8C\x6D\xB0\xB3\xAB\xCA\x92\x77\x08\xB7\x13\x86\x80\x12\xBB\x8F\x88\x54\xB7\xAE\x0E\x54\x64\xD2\x3B\x9F\xB0\xA8\x81\xA9\xB2\x99\x23\x8A\xA6\xD1\x8E\x6B\xD2\xB3\x3A\xB4\x80\x81\xE6\xB5\x61\x5D\xAB\xA3\xC5\x80\x53\x37\xB5\x14\xB2\x19\xAE\xA0\x7B\x16\x19\xA6\xBB\x9A\x6C\x69\xD1\xB2\x4B\xB2\x96\x67\xEA\xB0\x0F\x1A\x15\x88\x99\x75\x69\xC9\x12\x77\xB5\x46\x4F\xAC\x7A\xB7\x8E\x15\x15\x04\x7D\x16\xA6\xB4\xF3\xB5\xE0\x8B\xEE\xB3\x16\x1F\xD0\x3D\x2D\xAF\x68\x80\x12\x14\xB3\xE0\x8B\x55\x80\x15\x73\x94\x3F\xCA\x50\x29\x83\xB6\x39\xB7\x95\x8C\x56\x84\xD2\x3B\xBC\xBF\xF0\x26\x61\x5B\x82\x41\xB7\x30\x24\xAE\xB2\x2D\x87\xE2\x22\x0B\x88\x0F\x57\xB7\x77\x70\xBE\xB4\x82\xB1\x76\xBD\x87\x7E\xDE\x9D\x04\x4F\x94\x1D\x02\x44\xB4\x80\xB4\x17\x76\x0C\xB5\x14\x34\x77\x4A\xA1\xD1\xB5\x36\xB6\x36\xA6\xFC\x9E\x03\x0D\xDF\x96\x04\x12\xA4\xCF\xA0\x44\xB7\x85\xB3\x7E\xB7\x0C\xB0\x2C\x4A\x36\xD1\x85\xC9\xA0\x53\x96\xB8\xB1\x7A\xBC\xBF\xBC\x3D\xBF\x6F\xB5\x57\x59\x38\x53\x95\xF6\xB6\x4D\x2B\xBD\xB5\x7C\xAA\x6C\x90\xA4\x05\x73\x00\xBA\xC3\x93\x80\xB8\xBC\xBB\xCA\xBB\x3A\x87\xB8\x6D\x00\x21\x01\x02\xBE\x61\x9B\xC0\xB5\x94\x0D\x70\x98\x9D\xDC\xB2\xE8\xA0\xA0\x02\x17\x34\x18\xA8\xCF\x8E\xD1\x4B\xB3\x85\x57\x52\x85\x43\xAF\x6F\x50\x9F\xA0\xDD\xBA\x1E\xBE\x00\xE5\x83\xCA\x8F\x15", "\x11\x62\xB6\x78\x93\xD8\xBB\x28\x2D\xB5\x3B\x97\x18\xB8\xD1\x96\x27\x09\xB1\xB7\x0F\x88\x6A\x9F\xB2\x1A\x72\x19\xB9\x59\x74\xEF\x8D\x21\x16\xAD\x9A\x13\x51\xB5\xE2\x16\x1C\xB9\xBF\x6C\x88\xBC\x15\x1A\xE1\x92\xC9\x07\xB4\x5F\x13\x4F\xB5\xBF\x69\x3F\x81\x90\x53\xE8\x3C\x07\xDC\xB6\x8D\xB6\x6D\x96\x5B\x54\x8A\xB7\x5F\x0A\xF4\x00\xA5\x08\xB5\x65\xB6\xF9\xB2\xCD\x69\xC9\xA2\x63\x06\x66\x9A\x1E\x99\xB3\x14\xB7\xCE\x8F\x82\x84\x8C\xBE\x5E\x16\xE2\xB3\xCE\x3F\xB8\xB0\xB6\x35\xB8\x94\xAC\x5C\x8F\x7B\x61\x07\x5B\x6E\xE7\x57\x39\x85\x70\x41\xB4\xB7\x73\xB8\xAB\xA3\xCB\x6D\x0B\xF4\xB8\x33\x72\x76\x0D\xAF\xB4\x13\x84\xEF\x36\xD5\x97\x01\xF1\xB3\x3F\x85\x3C\xBB\xFC\x57\x56\xB6\xB5\x92\x03\x8F\x02\x94\x39\x27\x02\x76\x20\x56\x9D\x6F\x9A\x14\x02\xDD\x59\x66\xE0\x8D\x02\x02\xD3\x75\xAB\xB4\x92\xB0\x12\x0A\x9D\x4C\x72\xD9\x80\xD8\x8C\x40\x17\x1D\xBD\x0B\x8E\xC8\xB4\x04\xA8\x01\x08\xB5\x2E\xB2\x00\x03\x3D\x81\x46\xBC\xC9\xBC\xDC\x68\x01\x8C\xB9\xEB\x76\x48\xB9\x42\x02\x92\xBD\x78\x31\xE5\xA7\x72\xA6\xB4\x98\xB9\x80\x02\x26\xBB\x29\xB6\xCB\xBE\x01\x30\x72\xF5\x96\x95\xB9\x7C\x3B\x28\xBE\x2F\x7F\xC8\xA7\xE5\x80\x53\x29\xB9\xAB\xB8\xF9\xB1\x2F\xBA\x6B\x96\xB7\x14\xEF\x2F\xEE\x2F\xB7\x1D\xB7\xA5\xB1\xED\x74\x99\xB1\x5F\x1D\xC1\x2F\xEE\x37\xB7\x52\x13\xE4\xB7\x1B\x88\x7D\xB7\x7A\x1B\x1A\x2B\x7A\x60\x72\x99\xB2\xF9\xB5\x15\x57\x84\x5C\xCD\xA4\x38\x1A\x05\xA2\x58\xD8\xB8\xE6\x13\x9D\xB4\xA9\x1E\x03\x00\x5C\xB4\xC3\x11\x0F\xC8\xB9\x4F\x88\x30\xB8\x24\x01\xAD\xB5\xC9\xBC\x72\xF3\xB9\x6E\x01\x76\xBB\xF2\x70\x9F\xBF\xCB\xB3\x5C\xB1\x17\x08\xB5\x4C\xB6\xD4\x74\x3E\xBE\x07\x05\x68\x41\x5B\x12\xC3\x0C\xB9\x06\xBB\x39\xAE\x89\xB3\x5B\xBB\x94\xA9\xE8\xBC\x62\x84\xBA\xDC\x54\x87\xB8\x36\x61\x08\x32\xD1\xA8\xD7\x80\x65\xCA\xB2\xB7\x29\x8A\xBB\x8D\x55\xA0\xB1\x39\x12\x86\x66\x61\x1A\xBA\x46\x93\xF0\xA3\x40\x01\x3C\xA9\xD1\xBD\xE8\x97\x4C\xD4\x75\xE2\x63\x4C\x88\xEA\x01\x6C\x14\x41\x12\x86\x5B\x6C\x20\xBA\x6A\xAB\xFE\x3C\xD8\x11\x72\x0C\x3A\x1F\x0D\x2F\x0E\x31\x07\x17\xA6\x20\x00\x47\xBE\x70\x02\x0D\x74\xEF\x30\x74\xE1\x88\xFB\x12\xE1\x2C\x4C\xB9\x31\xA9\x74\x81\x5B\x08\x0E\x1C\x3C\x46\xBA\xC5\x02\x7E\x38\x17\x07\x12\x0C\xEA\x9A\x5A\x49\xBA\x96\x02\x93\x2C\x4C\xBA\x2A\x37\x31\xA9\xA7\xA6\x62\x53\xBA\xB4\x35\xAA\xBA\xA1\x2A\xA5\xBE\x39\x06\x1C\x08\x0E\x32\x2A\x50\xBA\xC4\xA0\x76\x28\xAB\xB9\x40\x5A\xEA\xA9\x83\x64\xBA\x5B\x16\x5E\xB1\x93\x34\xAB\xB0\x39\x1E\xEA\x8A\x06\x17\x3C\x61\xBB\x1E\x31\x58\xBC\x42\xAE\xA9\x9F\x02\x21\x75\xC4\xBA\xE7\x67\x47\x89\xE8\x00\xA9\xBF\x39\x10\x24\xAF\x59\x3C\x4E\x06\x02\xC0\xB9\x49\xBE\x70\x0B\xB6\x0C\xA8\x15\x93\x28\x2B\x61\xBB\x7F\x71\x8B\x3C\xED\x26\xD7\xB8\x5A\x06\x2C\xAB\xA4\x42\x55\x99\xB8\x61\xB8\x92\x80\xD6\xBD\xEB\xA1\x0E\x06\xBB\x6B\xA7\xC6\xBA\x5B\xBE\x32\x07\xFA\x80\xB4\x0C\x76\x89\xBB\x90\xBA\xDD\x4A\x64\xBC\x5A\x0B\xB6\x10\xEB\x96\x76\xE8\x00\x7C\xBB\xC9\xB9\xE8\x01\xE7\x4B\x73\x41\x04\x7A\x75\x8B\x81\x34\x2A\x3C\x49\xAE\x28\xB4\xB8\x0B\xAE\xAD\x1F\x76\x8E\xBB\x9C\xBB\xD0\xBB\x83\x29\x6D\x17\xDA\xB5\xEC\xAA\x76\xB0\xBB\xD5\x29\xC3\xBA\x66\xBC\x5A\x0A\x7C\x85\x91\x97\x6B\x25\x46\xB4\xBA\x55\xA1\x64\xBC\xB7\xBF\xDB\xA6\xED\xBF\x76\xA9\xBB\xA4\xBA\xBF\xBA\xEE\x67\x24\x0D\x3B\x6F\xED\x98\x76\xEA\x2A\x88\xBA\xDC\xB9\x1B\x07\x14\xA7\xDC\xB9\xEE\x9B\x76\xDB\xBB\xBA\xBB\x1E\x2C\x73\xB9\xBA\xB1\x3A\x00\x7C\xB9\xA7\x2F\xBB\x72\xBB\xD3\xB8\x5D\xB9\x5B\x93\xD8\xA4\xEF\x8B\x02\xC4\x2F\xC6\x90\x9D\x17\x1C\x8A\x67\x1D\x86\x2E\x03\x2B\x40\x76\xBB\x79\x88\xD4\x07\x1E\x8A\x67\x16\x48\x88\x1D\x1F\x9A\x02\x89\x47\x6C\x42\x89\x7E\x5C\xA9\x2F\x47\x88\xFF\x0A\xE2\x6B\x26\xAA\x3F\x64\x8F\xCD\x5A\x44\x38\x0D\x4F\xED\x88\x6B\x53\x16\x03\x73\x2E\x84\x11\x54\x0D\x5F\x25\x8C\xEB\xA7\x60\x0A\x2A\x56\x17\xFD\xB8\xEA\x05\xBF\xB1\x37\x1F\xEF\xBC\x77\x81\xBC\x08\xBC\x0E\xBC\x20\x88\x69\x5A\x48\x9C\xC2\xB1\x2A\xF7\x3A\x67\xBB\xD3\xBB\x83\xB8\x0D\x0E\xBB\x52\xF0\x88\xA5\x61\x94\xC6\x9C\x4C\x88\xB1\x2A\x67\x1E\xDC\xA4\xEE\x8A\x06\x14\xBA\xDA\xBA\xE8\xB5\x05\xBA\xA8\xBA\xDD\xAF\xE0\xB9\x75\xDA\xBB\x1F\xBB\x1C\xBD\x07\xBA\x62\x2E\xC2\xA3\xEE\x87\x0E\x0A\x03\x3E\xBD\xF3\xBB\x69\xB8\xC7\xBF\xDB\xBA\xF1\x89\x32\x7B\xB2\xD6\xBB\x1A\xBF\x19\x03\x6D\x11\xE4", "\xAD\xF2\x83\x79\xAE\x26\x45\xBC\xEB\xB9\x7C\xB8\x75\x0F\xD0\x29\x46\x99\x66\xC9\xB8\xBC\xB8\x3D\x8B\x96\xB9\x6E\x0B\x7B\x34\x23\x90\x71\x8B\x15\x14\xB3\x0C\xBF\x98\xB8\x4C\x03\xDF\xA8\x1D\x3A\x77\x78\xBB\x86\x42\x0C\x51\x86\xB9\x6E\x72\x02\x05\xF0\xA2\x78\x86\xBC\x03\x2A\x00\xBD\x40\x5A\xC0\xB7\xE7\xBF\x34\x49\x12\x89\xBC\xA1\x74\x46\x88\x77\x86\xC1\xB2\x49\x90\xF0\xBC\x42\xEA\x88\x13\xBD\x42\x53\x5A\xBB\xC6\xB8\x3A\x1F\xDE\x7A\x11\xF4\xBC\x76\xBD\x52\x35\x81\xBE\xC3\xBB\xE1\xA0\xF1\x8A\x12\xC7\x2D\x93\xBC\x44\x89\x88\xB8\xCA\x62\xE8\xB7\xEA\xAA\x78\x85\xBD\x2C\xBD\x08\xBC\xA2\xBF\xC5\xB4\xE1\xAD\xBF\x62\x77\xA8\x07\x6B\xBD\x32\x01\x9B\xB9\x6E\x0F\x66\x38\x23\x86\x04\x2E\xBD\xCC\x90\xFD\xB8\xA4\xBF\xC3\xB8\xE9\xA7\x24\xB4\xAB\x7A\xBC\x84\x5A\x3E\xBE\xA4\xBE\xD6\xB5\x85\x7F\xF3\xB8\x28\xF3\x8F\x8D\x88\xEF\xBA\x7B\xBB\xC5\xBD\xE2\xA3\xF5\xBE\x0A\xB0\xBC\xA2\xA2\x0B\xBF\x42\xB6\x22\xB3\xCC\x9B\x18\x43\x64\xFB\x84\x62\xAD\xAF\x08\x99\xAC\x21\xB3\x33\xBF\x98\x9E\x5E\x36\xA6\xEE\x32\x9C\xA4\x1D\x52\x67\xAD\xD2\x24\xC9\xA9\x65\x40\xA6\x89\x4E\xA2\xA5\x69\x06\x68\xA0\x6C\xA8\xE9\x8A\x3A\xD8\x72\x4B\xA7\x1C\x60\xB0\xAF\x69\xA1\x05\xB2\xF9\x55\x4D\x85\x64\xAA\x99\x77\xBD\xB8\x74\x55\x62\x44\x58\x40\x50\x11\xB1\x4E\x48\x49\x73\x23\x1A\x61\xF3\x20\xF7\x59\xFA\x5A\x27\x50\x48\xE0\x75\x29\x4B\x26\x4E\x10\xB5\x7F\x83\x9B\x9A\x1A\x01\x49\x01\xBF\x28\x8B\x1B\x4B\x5D\x7A\x8B\x4E\xD7\x65\x41\xD8\xAE\x52\x89\x60\x49\x50\x67\xDE\xBD\xE8\x75\x23\x6A\x4D\xD8\xBB\xBE\x89\xFA\x53\x36\x4D\x15\x47\x1E\x77\xC9\xA7\xEB\x73\x4E\x2C\x64\xFB\x56\xBE\x48\x08\xBB\x48\x5C\xC6\x2B\x68\xDA\x0C\xC4\xAE\xAC\x9E\x2E\x3E\x21\xA8\x7C\xBE\xA8\x9C\x33\xF8\xAF\x7D\xA2\xEE\x67\x77\x2A\x7E\x7D\x2D\xB8\x3A\x1C\x6E\xC4\x8B\xB5\x70\xE3\x8A\x61\x02\x97\x39\x5C\x81\x04\x58\xCF\x5D\x91\xDB\x66\xE1\x64\x74\x8A\xEB\x45\xED\x7C\x3A\x48\xCF\x39\x49\xE4\x66\xEC\x88\xE1\x29\x9D\x8B\xD9\x2E\xA4\x4F\xD2\x5F\x8B\x07\x9A\x72\x7D\x4B\xAB\xA1\x91\xB4\x9B\xBE\x93\xCD\x7B\xB1\xED\x7D\xF0\xAC\x45\x9B\xA7\xA6\xD1\x85\xBF\xB3\x17\x85\x3A\xE8\xAE\x17\x7A\x50\xAB\xBF\x82\x12\x5E\xD2\xA2\x55\xF1\xBD\xC1\x92\xDB\x7A\x0D\x00\x8C\x75\x73\x96\xF7\x8E\x60\xCF\xAA\xF7\xAF\x8C\xBD\xCF\x8A\x9B\x88\xF5\x95\xAA\x8D\x24\xBB\x99\x29\x7F\xB6\x9D\x00\xB7\x97\x96\xC7\x6D\x26\xB7\xFE\x03\x8D\xD0\x88\xA3\xAB\x52\x7F\x34\x9D\x9C\x8D\xAB\x8F\x27\x9A\xB0\x78\xAB\xD8\x9F\x6B\x90\xC6\x58\x81\xB7\x30\x88\x7E\x8E\x79\xA8\x02\xBB\xAB\x07\xB2\x85\x3F\x9D\x8A\x2F\x98\x42\xC7\x69\xBD\x93\x2A\x78\x9C\xB3\xE2\x05\xCC\x78\xAD\x88\xF3\x03\x02\xCA\x78\x17\xB2\x34\x8D\x99\x7B\x7E\x0B\x2E\x57\xD5\x75\xB0\xA1\x2C\x6A\x7A\xFA\x0E\xAB\x68\xDA\x6F\xDB\x6A\x69\x96\x7C\x30\xB0\x4F\x86\x63\xAB\x06\xB6\x5A\xBE\xE7\x6F\xFD\x13\xAB\x71\x7F\xCA\xAA\x0E\xB6\xEA\xA6\x7B\xAC\xC5\x84\xAB\x1C\xAB\xB2\x0F\x2A\x7A\x9E\xB3\x9E\x72\xCF\x77\xD9\x6D\x61\x41\xA5\x8C\x4C\x7D\x79\xB9\x54\x9F\x77\x9B\x27\xAD\xB8\x7E\xFB\x4E\xA8\xBE\xC1\x7A\x4A\x88\xA1\x7F\xCC\x9A\x33\x92\xFF\x4B\x9C\x9B\xB4\xF9\x62\x99\x8A\x20\x08\x66\x84\x35\xAE\xFF\x3E\xAE\x8F\x7E\xDE\x69\xA7\x8A\x98\x9D\x5C\x27\xFF\x77\x19\xAA\x3F\x10\x92\xEB\xBD\xA2\x8E\xFB\x77\x7F\xAC\x34\x80\x00\xA9\x8D\x7F\xBF\xF2\xBD\x16\xB0\xBD\x6C\x29\x5E\xFE\xAC\x19\xE0\xBF\x7E\x8D\x00\x81\x95\x8B\xFC\xB1\xFF\xA6\xFD\x73\x7F\x95\x8D\xEB\x6B\xDE\x7D\xFA\xB8\x43\x9B\x67\x97\x67\xB9\x27\xE4\xBF\xFE\xBE\xED\xA9\xAB\x88\x03\x85\xFF\xA0\xD5\x9F\x7F\x9B\x8D\x54\x8C\x54\x8C\xFF\xBF\xE5\x79\x65\x8A\x00\xF1\x6E\x2E\x8D\x96\x8D\xE6\x7F\xEA\x39\x60\xBC\x05\xA5\x41\x06\x6B\xB4\xB5\xA8\xB4\x19\x01\xDE\x9B\x20\x09\xF7\x8A\x50\xA9\x13\x74\xA0\x48\xA7\x94\xBA\xB0\x65\x03\xC3\x68\x84\xD6\x94\x05\x6B\xA2\x0E\x7B\x1C\x02\x5B\xA6\xCC\x92\xA3\xAF\xF9\x80\x42\xEA\xA0\xE3\x98\xD1\xAE\x5E\xA3\xCF\x7C\x17\xB7\xFC\xA7\x33\xD0\x99\xEE\x79\x7B\xB5\x93\x62\xAB\x99\x58\x58\x01\x1D\x35\xDF\x9A\xF0\xB5\xB0\x9A\x9E\x65\xCC\x65\xD6\x9E\xC2\x5A\x04\xE9\xAB\x63\xB0\x2F\x66\x79\xBC\xDF\x78\x2A\x62\x6A\xB4\x06\x8C\x65\x38\x00\xDB\x9A\x99\x9E\xCD\x7C\xF8\x7F\x01\xB6\x29\xF9\xBE\x4C\x9A\xE8\xBF\xDF\x73\xEE\x8A\x68\xA2\xBD\x92\x35\xFA\x4B\x24\xB1\x41\x95\x2B\xA7\x62\xB0\x73\x83\xC2\xB9\x06\xF3\x77\x34\x8F\x81\x02\xCD\x8A\x49\x98\x73\x9D\x02\xFF\x06", "\xD8\x6D\xEA\x74\xA0\xBF\x6B\x80\xE8\x8F\x12\x12\x0D\x8A\x1D\xB5\x83\xC9\x82\xF1\x82\xC6\xB3\xE6\x42\xB2\xA5\x60\x7B\x61\xFC\x85\x36\x00\x3F\xB2\x34\x51\x60\x88\x67\x3A\x3E\x8D\x58\xC4\x32\x0F\xAD\xC5\x38\xC1\xBC\x0D\x65\xE5\x7A\xCA\x63\x1F\x8A\xB1\x3C\xB6\xAB\x25\x91\x84\x66\xBA\xCB\x20\x71\xA2\xDF\x28\x8F\x2B\x34\xD5\x8D\x2D\xA4\xF5\x8E\x25\x86\xF5\xB7\xC3\x61\x84\xD8\x6F\xA7\xB4\x19\xC7\x2F\x90\x60\x99\xD5\x75\x00\x62\x95\xE4\x94\x5F\x77\xE3\x8C\xD4\x9A\xB1\x9B\x37\xAC\x2B\xA1\x66\x84\x77\x45\xB1\x70\xB5\x53\x60\x70\x59\x16\x6F\x85\x16\x76\x1C\x3A\x8C\x77\xC0\x5D\xE6\x5B\xB1\x7C\xA7\x97\xEA\x24\x76\x0A\x5F\x90\x77\x91\x6C\x53\x76\x30\x6A\x31\x48\xCC\x17\x4E\xE5\x95\x52\xAD\x54\x9B\xD3\x77\x28\x8A\xD5\x66\x75\x2C\x75\xE1\x92\x76\x67\x4B\x89\x56\x7E\xAA\x7A\xD9\x78\x82\xF2\x65\xBC\x80\x6F\xB0\x86\xAE\x42\x50\xD8\x38\x01\x12\x62\xC9\x30\x94\xB0\xAA\xBC\x84\xAF\x12\xB1\x75\xA7\xB4\x3D\x30\xDD\xAF\x29\x54\x3A\x84\xCC\x45\xD8\x7E\x04\x99\x13\xAB\x49\x9F\x3B\x38\x01\x06\x72\x9F\x83\xC4\x70\x28\x9D\xC2\xBC\xA8\x35\x6C\x83\x84\xD4\x70\xB4\x8B\x48\x59\x28\x92\x11\x3A\x82\xD1\xB3\x0C\x8E\x19\x0E\xC3\x8A\x04\x71\x03\x12\x01\x11\x1C\xD3\x4F\xF8\x8C\x8A\x8E\xF6\xAA\x78\x4D\x6F\x9F\x3E\x59\x1C\xCC\x35\xE8\x81\x4E\x85\x63\xAC\xE0\x8A\x83\x74\x06\xAF\x03\xA3\x85\x98\x16\x20\x03\xE8\xB3\x0D\x72\x8A\xB9\x07\xB6\x00\x25\xB1\x3E\xBF\x53\xB1\xDA\xA1\xC8\xAE\x5A\xB5\xB1\x77\x50\xF1\x58\x92\x43\x79\x80\xCF\xA2\x20\x83\x8B\x14\x98\xA8\xCC\x62\x2E\x87\x7D\x9C\x97\x11\x73\xD1\x74\xE7\xB4\x09\x88\xE2\x1A\x83\x52\x4B\xC5\x81\x40\x5D\x66\x65\xE9\x75\x08\x8A\xE3\x1C\x83\x18\x82\x3B\x7C\xE1\x74\x54\x7E\x04\xDA\xF3\x60\xE1\x21\x7D\x29\xAD\x51\x7C\x54\x84\x6C\x7F\x8A\xB2\x0A\xFE\xCD\x13\x77\x6E\x9E\xE9\xBE\xE5\x70\xFB\x63\xBC\xB8\x43\x36\xFA\x07\x4D\x33\x00\x5D\x7F\x95\x01\x10\x41\x5C\x85\xE5\x03\xF8\x24\xB0\xC4\x7D\xD8\x8E\xA1\x66\x49\x9D\x95\x6F\xDE\xB6\x00\x53\x94\x01\x03\x2A\x94\x58\x87\x0B\x5B\x99\x59\x52\xA3\xA1\x78\x57\xB6\x6C\x62\x56\x09\x56\x9F\xBE\x6B\x65\xF5\x93\x09\x8F\xA1\x1F\xB7\x44\x50\xB2\xBD\x1B\x47\x6C\x72\x41\x6D\x42\xE6\xB7\x73\x00\xB2\x83\x2D\x76\x06\x0B\x07\xB9\x61\x2B\xCC\x0F\x71\x78\x2A\x43\x70\xF9\x3A\x32\x82\x8C\x64\x88\x83\x54\x74\x82\x87\x83\x9A\x81\x62\x85\x9A\x29\x17\x8A\x5A\x57\xC1\x4C\x56\x7E\x83\x77\x87\x64\xC1\x18\x70\xED\x8D\xC5\x7C\x04\xCC\x70\x37\x82\x3D\x54\xB4\x4B\x63\x30\x1A\xCE\x0C\xBF\x05\xFE\x65\x91\x82\xD2\xC2\x3B\xA5\x30\x8F\x2E\x99\x0C\xFF\x84\x9B\xC3\x56\x71\x8B\x83\x4C\xC4\x0A\x5A\x0C\xA8\x7F\xB9\x6F\xD0\x3E\xEB\x9F\x41\x9F\x67\xA6\xDC\xBC\xDB\x24\x8D\xBD\x6F\xFF\xA1\x9B\x38\x0C\xB8\xA9\x92\xD3\x98\xAF\x8A\x4F\xB2\x35\xED\x9F\xB5\x57\x79\xA3\x65\x9F\xD7\x9E\xAF\x99\xA6\x00\x2C\xB2\x12\xB7\x94\x67\x9E\xAC\x87\x60\x95\xE9\x9E\xFB\x18\x70\x99\x9D\xBC\xC3\x09\xA6\x0D\x06\x31\xA2\x10\x10\x8C\xA0\x70\x93\xA3\x76\x9A\xBD\x94\x5E\x9D\x3A\xCE\x19\xA6\x7F\x9A\x46\xA7\x9B\x62\x32\x7E\xA3\x67\xA7\x3D\xCB\xEA\x81\x88\x86\x87\xA5\xC3\xC8\xC3\xA7\xA1\xA9\x82\x43\xA1\x8D\x6F\x0B\x60\x42\xDD\x04\xF8\x59\xE7\x9D\x4E\xAB\x14\xA1\xAB\x85\x85\x95\x0B\xB5\xBB\x26\xA5\x5F\xA0\xAD\x9D\xF2\x66\x19\xD2\xAB\x98\xC5\x02\xC4\x0C\x27\xDE\x9F\xE4\x9B\x14\xC4\x22\xA8\x10\xED\x87\xA9\xA1\xBA\x85\xE2\x9D\x41\x72\x41\xC2\x10\xAC\x10\xCB\x3F\xB0\xA4\x10\x72\xCA\x3C\x91\x7F\x3E\x84\xB3\x8E\xF3\x36\x00\x38\x96\x00\x00\x9D\x97\x7D\x82\x3A\xCA\x1E\xC8\x74\xA6\x17\xEF\x53\x43\x97\x9A\x95\x2A\x54\x89\xB1\x4C\x2D\x9C\x51\xAF\x35\x00\xD4\x83\x80\x02\x75\x87\x7A\x5E\x70\x7F\xB7\x6B\x1E\x92\x6E\x42\xB9\xBC\x70\x08\x03\x24\x7A\x1C\x83\x0F\xA1\x83\xF4\x65\xA1\x6E\x0C\x87\x17\xB9\xC5\x90\x8D\x44\x6B\x76\xDC\x27\x6E\x93\x6F\x91\x8D\xF8\x99\xE6\x6C\x72\x7D\xB9\x63\xC6\x11\x52\x98\x83\xAB\x6D\xE7\x6C\xE6\x6B\xB1\x2F\x12\xE0\x08\xDE\x6E\x51\xC5\x84\x8E\xEB\x9D\x26\x82\x78\x6B\x11\xB6\xDE\x68\x3E\xB8\x6F\xB6\x6C\xD1\x6F\x30\x50\x03\x4D\x4B\x79\xDD\x48\x6E\xAE\x6F\xBE\x6D\x98\xC5\xE9\x6F\x2D\x94\x12\xE6\xDD\x30\x37\x84\x6E\x0D\x31\x9A\xC7\x45\x8E\x76\x7B\xBD\x66\xC6\x16\x84\x1F\x85\x2B\x57\xE7\x7C\x47\x6D\x7A\x79\xDC\x25\x08\xA4\x52\x7F\x6F\x31\xC7\x4F\xC5\x4C\xC6\x8F\x4D\x4A\x68\x89\xAE\x84\xFA\x16\x18\x86\x9F\xC2\x24\xC9\x92\x69\x17\x81\xDF\x65\x85\xA8\x52", "\x58\x2F\xBA\x85\xD6\x3A\xC8\xB4\xC9\x78\xA6\x11\x71\x2F\xAB\x3E\x53\xF3\x6A\x7F\x51\x7D\x61\x4D\x7D\xE4\x79\x7E\xF7\x85\x64\x6D\x39\xBF\x0A\x17\x72\x99\x61\x74\xF3\x2F\x72\xCD\xB1\xB7\x4C\x3B\xBE\xE1\x60\xC3\x58\x61\x5D\x73\xA3\x48\xB3\xC2\x04\x05\x1A\x05\xE6\x5F\x27\xCE\x5C\x8C\x54\x3E\x26\x72\x00\x1B\x5A\x0A\x5F\x56\xC2\xD7\x33\x0D\xFE\xB0\x3F\x26\x40\x59\xC5\x3F\x4E\xBB\x6F\x07\x31\xB5\xF2\x8C\x8B\xBC\xB1\x6F\x2C\x91\xBA\x40\x04\xA4\xB6\xE4\xB2\x86\x44\x87\xC8\x3E\x8C\xBD\xAE\xB8\xB5\x05\xA5\xB9\xD3\xBE\xED\x8F\x8B\xF8\xAC\x23\x2A\x99\xBB\x78\xBF\x0C\x05\xD3\xAE\x1D\x06\x05\x38\xBA\xBC\xB1\x29\xC3\x9E\x99\xAC\xB0\xDD\xA7\xF2\x96\x06\x6F\x2C\x6C\xB0\x00\x00\x7D\xAF\xAE\xB3\xD6\xA6\xE9\xBC\x62\xD4\xBA\x6A\xBA\x4F\xBC\x4F\xBF\x62\xA8\x2F\xD8\x86\x4B\x7A\x8F\x30\xE3\xC4\xC4\x06\xBA\xC1\xC0\xAF\xDA\xAD\x17\xEB\x2D\x17\x3A\x3D\xBF\xA7\xBB\x69\xBF\xBA\xB5\x85\x26\xF2\x85\x77\x96\xC4\x4C\x38\x61\xBE\xBB\xC0\xBC\xB5\xDB\xAE\xC5\x22\x76\xE3\xC5\x6B\x16\x20\x01\xAA\xBB\xD5\xB4\xF6\x54\x01\x2E\x7A\x83\x02\xB0\xBD\x05\x23\xA3\xBD\x5F\x31\xE9\xB5\xF5\xBE\x77\xEB\x55\xB8\xBC\xFE\x42\xAE\xBE\x64\xCD\xE1\xBA\xF4\xA5\x78\x8A\xBC\xFE\x65\x60\xBE\x91\xBB\x6D\x14\xEC\xA2\xF5\xAD\x1E\xB1\xBC\xA7\xBD\xB8\x04\x10\x06\x42\x2C\x78\x32\x6D\x8B\x33\x36\x11\xB6\x05\xA3\x1C\xD2\x1B\x59\x1F\x66\xB4\xF6\xBE\x4E\x5C\xBD\x05\x1A\x9D\x1E\x38\x03\x05\x2B\xF9\x1F\xC1\x4D\x5E\x6A\x5E\xDC\x14\x91\xB2\xCE\x1C\x1C\x0C\x34\xC4\x0B\x39\x64\xF8\x53\x4E\x68\x6B\x06\xCE\x1E\x1C\x05\x35\xCC\x0A\x33\xBD\x0B\x12\x5A\xC7\x93\x00\x3A\x05\x6B\xC2\x13\x14\xCA\xA0\x8D\xF2\x09\x3A\x1E\x75\x00\xD9\xC4\x24\x08\x9F\x67\x1B\xD5\x1A\x3A\x1E\xEC\x01\xB5\xC7\x48\x07\x4A\x7E\x36\xDC\x34\x3A\x3C\x6E\x01\x72\xC6\x91\x01\xEB\x85\x6E\xC4\x45\x1A\x79\x30\x03\x79\xC6\xFF\x01\xCA\xB0\xDF\xC3\x58\x0A\xF3\x12\x07\x00\x8E\xA6\xB3\x83\xC7\xE1\x02\xCE\x18\xDB\x92\x10\x1A\x81\x32\xC8\x36\x00\x89\xC6\xA5\x02\xCE\x1E\x1E\x07\x38\xC5\xCE\x91\x8E\xA0\x02\x3A\x1E\x7C\x01\xE5\xC2\x46\x68\x03\x17\x1C\xF4\xA8\x00\x00\xFA\x01\xCD\xC5\x54\xA6\x73\xCA\xF3\x1C\x07\x00\x8E\xE9\xA4\xA4\xC7\x93\x03\xF6\xBE\x11\x24\x16\x00\x94\xA9\x8E\xED\x1F\x8D\xC7\x51\x14\x54\x26\x5C\x3F\x3A\xC8\x74\x1E\x3D\x5A\x20\x57\x9B\x27\x6A\xFC\x77\xBB\x12\x4C\x9A\x79\x04\x00\x37\xC7\xAD\xC7\xE1\x88\xAD\x09\xF9\x0E\x2D\x1A\x79\x0E\x30\x9B\x21\x64\x03\x83\x8B\xA6\x14\xEC\xB1\x07\xC6\x2D\x00\x8F\x87\x18\x45\xAB\xF8\xAC\x89\x04\x78\xCF\x7D\x1A\x79\x0A\x00\x4F\xC7\x32\x03\xCD\xBF\xF4\xC5\x29\x15\x3C\xC4\x18\x18\x8F\xB8\x06\x84\xB4\x8E\x64\xF5\xC5\x01\x1A\xF3\x0E\x00\x1F\x8F\xD7\x13\xE4\x5E\xCD\x7F\x4C\x1C\xFE\x75\x3D\xC7\x0B\x27\x8F\xA2\x02\x1C\xC0\x30\xA0\x6B\x2B\x3F\x12\xF7\x9A\x79\x12\x00\x6F\xC7\xFF\x00\x17\xC1\x19\x03\xC0\x18\xCE\x9A\x79\x14\x00\x78\xC7\xCC\xB5\xF1\xC4\xFC\x0A\xE7\x16\x01\x18\x1F\xE1\x15\x82\xC8\x13\x0E\x9D\x1C\x06\x00\x7F\xCD\xAE\xAC\x6B\xA5\x26\x0F\x4B\x3A\x1E\x0D\x02\x01\xCC\x4D\x96\x1D\x08\x68\x00\xFA\x71\x0B\x3A\x1E\x0E\x00\xFE\xC4\x0D\xCD\x82\x4B\x81\x46\x1D\xAB\x08\x3A\x1E\x0F\x03\x04\xC9\xE9\x85\x94\x69\x3E\x05\xE5\x3A\x1E\x22\x6F\xA1\xC6\x77\x1A\xFB\x62\xA1\x4C\x67\x30\x1E\x91\x0F\x3A\x1E\x11\x00\xFE\xC2\x15\xCE\xAE\x8C\x0C\x36\x26\x19\x4E\x3A\x1E\x12\x00\xFE\xC0\x6C\xB2\x23\x14\x51\x0D\x99\x76\x16\x3A\x1F\xBD\x5C\xF2\xC5\x38\x02\x0E\xC9\xDB\x9B\x3C\x1D\xB1\x98\x16\x9D\x1C\x0A\x00\x7F\xC0\xB8\xAB\x4D\x04\xA9\x49\xC8\x27\x02\x15\x03\x0E\xC8\xDD\x82\x63\x09\x62\x20\x84\xC0\xC8\x27\x02\x16\x00\xFE\xC3\x24\xCA\x34\x7B\x4F\x09\xEE\x3A\x1E\x2E\x00\xFC\xC7\xEC\xB5\xF0\x09\xBD\x15\x0A\x98\x91\x89\x02\x30\x00\x06\xC8\xD9\x4E\xD7\x7F\x8C\x09\x0B\xF0\x90\xA7\x02\x32\x01\x11\xC9\x93\x95\x0B\x5B\x9A\x0A\x53\x90\x91\x89\x02\xD1\xA6\x1E\x2A\x4C\x00\x31\xC5\x47\xC6\x0C\xF2\x08\x3A\x1E\x36\x00\x31\xC8\x73\xC7\x1C\xA8\x0C\xA6\x2B\x0A\x43\xF9\xC3\x3A\x1E\x1C\x02\x1C\xCA\x1A\xA3\xAA\x8B\x49\x3A\xAE\x3A\x1E\x3A\x01\x45\xC8\xBF\x78\xD3\x9E\x48\xD2\x15\xBA\x3C\x3C\x00\xF8\xC7\x52\x84\x3E\x11\x18\xA3\x28\x1A\x79\x3E\x00\x1B\xC8\x23\xC5\x20\xC6\x4F\x03\xBA\x12\x4A\xD9\xC5\x52\x67\xF8\xC7\x34\xC5\xFB\x16\x91\xC7\x8E\xC6\x10\x02\x02\x13\x91\xC8\xC4\x40\x53\x15\x61\xCA\x6D\xEE\x0A\xF3\x1D\x7A\x3A\x91\xA4\x02\x6C\xB9\xEE\x0A\x2C\xC9", "\x51\xCC\x4A\xC0\x5B\x9B\x91\x95\xC5\x9D\xC4\x76\x0F\x28\xBC\x90\xB7\x7D\x7D\x25\xC2\x04\x48\x00\xF8\xC7\x4F\xB9\x2B\xB8\xBF\x1F\xA6\x00\x21\xE7\x04\x4A\x00\xC9\xC9\x43\xB8\xE8\x70\x9F\xBC\x4C\xDF\x43\x0E\x93\x96\x4C\xB7\xC9\x91\x00\x35\xB8\xBC\x06\x4D\xD4\x25\xE7\x04\x6C\x1F\x43\xC9\xEC\xC5\x5B\xC6\x55\xCF\xA6\x0E\x5C\xBA\x3C\x50\x1E\xD9\xC9\xCD\x14\xD4\xA5\x96\xB8\xCF\xAD\x26\xDE\x93\xE8\x5D\xF8\xC7\x65\xC7\x19\x02\x1A\x6C\xB1\x03\x17\xD2\xC3\x3A\x1E\x96\x21\xD8\xC7\x0A\xCD\xA8\xBA\xDD\xB8\x47\x23\x76\x93\xC6\x3A\x1F\x2F\x02\x24\xCB\x5D\xC7\xDA\xBE\x27\xD8\x8C\x90\x89\x3A\x1F\x30\x00\x2A\xC9\x8E\x8A\xB3\x1D\x5F\x16\x2D\x3A\x1E\x63\x00\xFC\xC7\x16\x01\xEC\x1B\x09\x20\x82\x00\x04\x20\x21\x42\xC7\x8C\xCA\x46\xCB\xA3\xCC\x51\xDD\x28\xDE\x94\x9F\xCA\x20\xCB\x8C\xCB\x3F\x06\xA2\xC7\x51\x0F\x49\x1B\x94\xC0\x20\x1B\xCB\xD5\x12\x99\x2E\x86\x4D\x05\x41\x21\x3A\x3C\x0A\x2E\x56\x1E\x8B\xC8\x30\x21\x60\x11\x52\xC8\x7A\x16\x94\xC4\x28\xD4\x1F\x9A\xC8\xDC\x18\xE6\x0E\x3B\xD1\x69\x2A\x1E\x7C\x3E\x64\x00\x98\xCA\x46\xC9\xE4\x14\xF8\x3C\xA7\x2F\x94\xC1\x2E\x23\xCA\x9E\x1C\x2D\xB9\xA7\xC1\x52\xDB\x29\xDA\x94\xBC\x12\xFD\x17\xC4\x3C\x57\x02\xA8\xC9\x51\xC4\x2A\xF1\x7E\x4C\x0E\x47\xCB\x91\x3D\xC2\x06\xA2\xC9\x0F\x2A\x84\x0D\x95\xB6\x11\x47\x1E\x9E\x11\xF2\x0C\x7B\x14\x55\xC2\x1A\xD6\x95\xBD\x3F\x58\xCA\x3F\x26\xCF\xC4\xCC\x06\x51\xC4\x88\x1E\x95\xA0\xCA\x4E\xCB\x8C\xC8\x4F\x12\x29\x25\x29\x05\x2B\xC7\x3D\x67\xCA\x8C\x71\xB4\xC9\xCF\xC2\xE2\x9B\x55\xDC\x79\x2A\x51\x4C\xCA\x70\xCA\xB0\xCB\xD0\x1C\x27\x1A\x7A\x09\xFD\x36\x95\xC3\x1E\x78\xCA\xBD\x81\xD0\xC2\xAD\xCC\x57\xCC\x2B\xFC\x3C\x78\xA6\xDD\x1F\xAF\xC9\xEA\x11\xAC\xC1\xD3\x08\xA1\x19\x26\x07\xCB\x3F\x1F\xC4\xCB\xDD\x3D\x27\x09\x55\xCD\xC6\x7D\x95\xC4\x1E\x29\x23\xB7\xCB\x47\xC9\xAE\xC2\x34\xD0\x2A\xF8\x2C\x41\x3F\xDF\x15\xA0\x2F\x46\xCA\xB3\xCD\x56\x3D\x2C\xEB\x95\xCE\x03\x16\xCB\x9B\x22\x68\xCE\xA3\xC4\x5A\xD4\x2C\xD2\x3C\x0B\x03\xFD\x16\xE7\x3C\x66\xCB\xE7\x1C\x5A\xC5\xFD\x2E\x96\x8D\xCB\xB0\xCA\x9E\x1F\x50\x23\xB6\xCD\x51\xD5\x2D\xC3\x96\xBE\xCA\xB6\x10\xC1\x2B\x6E\xCD\x7C\xCD\x4E\x05\x2A\xFA\x95\xCC\x3E\xAF\xCB\x98\x02\x45\xCE\x29\x24\x5C\xDC\x28\xC6\x97\xBF\x1E\x84\xCA\x5B\x10\xF8\x3B\xB9\xCD\x4E\x0C\xE0\x8E\x97\x8B\xCB\x7B\xCA\xDA\x9F\x67\xCB\x13\x2A\x15\x21\x2F\xF5\x94\x9F\xCA\x49\xCA\xA2\x1C\xCF\xC7\xF0\x17\x5E\xDB\x79\x29\x97\x9B\x21\x25\x64\x5C\x1D\x7B\xCB\xBE\xC0\x52\xCF\x2F\xC8\x3D\x60\x28\xD5\xCB\x8D\xC8\xDC\x18\xA5\xC2\x58\xC5\x6E\x29\x25\x3F\xCB\xE2\xCA\x97\xCA\x46\xCB\x23\x29\x07\x68\xFF\x00\x98\xB4\xA2\xE0\xCB\xC6\xC6\x45\xC8\x08\x23\x54\x07\x2F\xFF\x03\x39\xB9\x71\x1E\xB8\x1F\xE7\x72\x68\xC0\x04\x2F\x01\x1E\x3D\x70\x1E\x2F\x12\x0B\xCD\x48\xCA\xE1\x2C\x5F\xD3\x2C\xF8\x3A\x79\x13\xFE\xC7\x47\x6F\x3C\x87\x1F\x00\xF7\x04\x81\x7A\x3C\x40\x20\x6B\x01\xE9\xA4\xCE\x15\xDF\x3D\x61\xC7\x7A\x1C\x98\xCF\xCA\x9E\x1A\x9D\x1F\x22\x6C\xC4\xC1\xC9\xBA\x28\xC0\x41\x39\x00\x2A\xCD\xE7\x67\x40\x00\xC7\xCB\x61\xC1\xBA\x2D\x98\x8B\x1A\x0B\x1A\x10\xCE\x2D\x32\x66\x96\x78\x94\x31\xC9\x04\x47\xB6\x3F\x1E\x20\x20\x05\x01\xC7\xC2\x2D\xBD\x25\x3F\x98\xBF\x1E\x2F\xCC\xB9\xC9\x8C\xCF\x81\x1D\x02\x94\xB4\x1E\x96\x46\xCC\x06\x03\xAE\xC8\x85\xCC\x60\x0C\x64\xDE\x96\x95\x0C\x4F\xCC\x3B\x1F\x28\xCD\x69\xCB\xCA\xCE\x1C\x50\x65\x5E\xA5\x58\xCC\x03\x02\xB7\xCB\x96\xCA\x10\x1D\x65\xD6\xF9\xAC\x99\xBD\xCC\x5A\xCB\x10\x08\x98\xC9\xDE\x0F\xEB\x13\xF2\x21\x98\xE9\x88\xC4\xC9\xD8\x00\x9A\xCA\x20\x0E\x0C\x39\x28\xC0\x41\x07\x00\x6D\xCC\xEB\x0F\xD3\x03\xCE\xCC\x58\xC1\x30\xFD\x04\x73\xCC\xFD\x22\x9D\x1C\xE4\xB3\xCF\xC8\x70\x16\x31\xEC\x0D\x01\xCD\x30\x13\x47\xCC\x9C\xCE\xB3\xC1\x42\x10\x7B\x0A\x9A\x9A\x1A\x80\x30\xE3\xC5\x3D\xC0\x33\x00\xF7\x10\x30\xE7\x98\x89\x0B\x90\xCD\x97\x13\x00\x30\xA4\xC2\x66\xD6\x2D\xED\x31\x42\xCC\x28\x1B\x31\x85\x5A\x34\xD1\xCA\xCA\xAE\x34\xC9\x04\x56\x01\xB0\xC6\x37\xCE\x41\x00\xD6\xC3\x69\xD1\x2E\xF3\x99\x8B\x12\x1E\x5E\xCE\xC9\x53\x15\x42\x8E\x68\x2C\x35\xF5\x14\x9F\xCD\x09\x03\xAE\x99\xD9\x1F\x25\x1D\xD5\x9B\x28\xE5\x9A\xC7\xCB\x80\x1C\xDE\x27\x90\xCC\xE6\xA0\x0B\x5B\x28\xE1\x39\x5F\x5F\xBD\x63\xB7\xC7\xB2\xCF\x7D\xA3\x8F\x2C\x35\xFC\x18\x40\xCD\x06\x02\x41\x01\xAC\xCA\xD0\xC9\x10\x1A", "\x36\xF5\x9A\xC0\xCB\x65\x00\x44\xCC\x99\xCB\x1E\x47\x74\xAA\xD9\x16\x9B\xAE\xCD\x45\x43\x6D\xCD\xA4\xC9\x21\x01\x71\xA6\x36\xFE\x98\xB0\xCC\xC9\xCC\x9D\x1F\xDC\x5F\xDC\xCE\x67\xC7\x09\x3F\x01\x6A\xCD\x2F\x13\x7B\xCF\xB7\xCE\xD0\xC1\x6E\xD0\x37\xE7\x9A\x82\xCC\x65\xCC\x66\xCD\x96\x34\xD5\xC6\x69\xD8\x28\xC6\x04\x20\x9C\xC3\xCC\x9A\x9D\x4D\xCF\xD8\xCF\xF3\x09\x93\x2A\x1C\x07\xCC\xAA\xA3\x04\xCF\xD1\x1A\x7C\x19\x7F\x20\x38\xD0\x97\xE0\xCD\xAC\xCD\xBF\xCB\xD0\x18\x08\x29\x02\xB8\x30\xE7\x04\x29\xA0\xEE\xCD\x38\xCF\xA1\xCA\xA3\xCF\xA6\x0D\xF7\x16\x9C\xF0\x4F\xF0\x4E\x1C\x84\x50\x73\xF8\x61\x13\x10\x7B\x38\x94\x9B\xCE\x8C\x8E\x7C\xCD\xCC\xCB\xDF\xC8\x60\xD5\x34\xDA\x94\xC9\x0F\x3A\x50\xEB\xC7\x5A\xC5\x0B\x5C\x6A\xC0\x86\x18\x9B\x83\x7E\x32\xCF\x5C\x6B\xC2\xC9\xE8\x25\x70\xC9\x35\xCB\x1C\xFE\x2C\x9A\xCD\x5E\xA7\x1E\x18\xEE\x12\x51\x9F\x39\xEE\x0F\x7D\xCB\xEB\xCC\x83\x01\xB1\x24\xE6\xC1\x71\xD2\x33\xFE\x9B\xC1\xCC\x27\xCE\x08\x9D\x63\xB4\x31\x2A\x51\xC6\x72\x2E\xC6\x0B\x5B\x10\xCF\x01\xA8\x0C\x04\xA7\xCF\xEB\x0B\xFB\x13\x34\x3D\x5D\x79\x01\xDC\xCB\xAB\x5C\x2A\xBC\x6A\xDF\x38\x0E\x9D\xC9\x59\xD5\xCB\x97\x12\xDC\x91\xE4\xC4\x69\xC3\x39\xD2\x99\xF1\xCD\x3B\x14\x52\x48\x4F\xB1\x45\x69\xA8\x10\x7B\x17\x14\x6F\xCE\x13\x11\xA0\xCE\x41\x02\xDC\xBC\x51\xCC\x38\xFB\x3C\x09\xCD\xD3\xCD\x8F\xAD\xB5\xC8\xEE\x14\x86\x00\x3C\xC4\x9E\x9E\xCE\x67\x5F\xA1\xCE\xC8\xCD\xDF\xC7\x77\xDF\x37\xFA\x9A\x81\xCE\xD4\xCC\xF0\x34\xAB\xCD\xF6\x00\x78\xC4\xB9\x00\x96\xDE\xCC\x03\x02\xCF\xCE\x47\xCA\xE1\x25\x74\xDC\xEB\x06\xA9\x48\xCE\x85\xCD\x9A\xCE\x73\x00\xEE\x1C\x44\x00\x3C\xD4\x97\xED\x18\xA0\xCE\x81\x03\xEB\xCF\xA3\xC6\x78\xD2\x31\xF8\x50\x1C\x10\x61\xCE\xFE\x2F\x46\xC9\xD2\x10\x81\x39\x3D\xCD\x7D\x21\x08\x64\xCF\xAF\x12\xE0\x13\x05\x45\x81\x2B\x49\x2C\x08\xF9\x00\x0A\x2E\x56\xCD\xEB\xCE\xE0\xC3\x10\x12\x2D\xF0\x9E\xB2\xCD\xCD\xCE\xC9\xCD\xDD\xCC\xF2\xC2\x34\xCA\x8A\x38\x9E\xA9\xCF\x55\xCF\xCB\xCE\xD0\xC4\xF7\xC1\x7A\x3E\x3D\xF8\x52\x41\xCF\x8B\x15\xE1\xCE\xCD\x3D\x40\x1B\x92\x19\x13\xC1\x46\xC8\xCA\x70\x1E\xCE\xCC\xF3\xCA\x20\x00\x59\xDD\x84\x3A\x98\xEC\xCF\xD2\xCF\xE8\xC9\xE9\xCE\x48\x57\x7A\xD9\x34\xD8\x9F\xBD\x3E\xAC\xCD\x38\x0C\xE0\xC9\x60\x10\x79\xCB\x88\xB4\x9E\xC1\x2E\x65\x1F\xF3\xC9\xF2\xC8\xEE\x15\x4E\x00\x3C\xDC\x29\x7D\xCF\xA5\x87\xFF\xCF\xE4\xCB\xCE\xC4\xDA\x02\x57\x1E\x9F\x89\x06\x70\x1F\x51\x0C\xE0\xC8\xE6\x08\x80\xD2\x2F\xE3\x9E\xEF\xCD\x19\xCB\x48\x1F\x7A\x2F\x01\xD4\x66\x1A\x7C\x25\x3D\x70\x0D\xFA\xCB\x5D\x18\xE3\x19\xFE\xC0\x6E\xD3\x33\xDA\xA0\xE9\x19\x1C\xD0\xE7\x01\xD9\x18\xCA\x01\x82\xD2\x1B\xA3\xA0\xD4\xCE\x3D\x3E\x13\xD3\x2E\x1B\x03\xD7\x7F\xDC\xBF\x3F\x03\x65\x1E\xB8\x0D\x16\xD2\xFF\xCF\xF2\x14\x82\xDC\x37\xF2\xA0\xF2\x86\x34\xD0\xF3\xC9\xF6\xC9\x26\x05\xF6\x00\x38\x3A\xA0\xAD\x2D\x6C\x1F\x1E\xD2\xEA\xCC\xFA\xC7\xF4\x07\x41\xC9\x90\xB5\xD0\xBF\xCE\x15\xD3\x9A\x13\xB4\xC2\x82\xDC\x41\xF0\xA0\xFC\x2F\x0C\xD0\x3F\x27\xBF\x11\x05\xD4\x84\xC9\x3C\xC7\xA1\xC4\x12\xEB\xCF\x8E\xC9\xED\xCB\xC5\xC2\x6B\xD1\xB2\x1C\xA1\xF4\xCB\x68\xD1\x34\xD2\x1A\xD1\x0D\xD6\x5F\xCD\x1C\xC0\x43\x6D\xCF\x6B\xD1\x38\xD2\x1C\xD3\x0E\xDE\x08\x24\x29\xE4\xA1\xC5\xCB\xA9\xCE\xF0\xCE\x8B\xCA\xB5\xCA\x51\xCA\x29\xF5\x90\x18\x1C\xCF\xCB\x04\xD0\xB8\xC9\xA6\xCC\xF3\x13\x29\xF5\x94\xC0\x20\x5C\x14\x3D\xD3\xD0\x1A\xA8\xCD\x86\xCE\x84\x2F\x9C\xEE\xCF\x20\xCB\xB2\x1D\x22\xD2\x09\xD3\x84\xCA\x44\xFE\x97\xED\x18\x50\x0F\x9F\xC8\x3B\x2C\xBB\xCB\x22\x3E\x2E\xD7\x95\x92\xCE\x5A\xCE\x8C\xCE\x45\xCB\xA9\xC1\x59\xD1\x44\xF9\xA1\x94\xD1\x3D\x3E\x4B\xD1\xCC\x09\xA6\x11\x55\xC2\x03\x06\x54\x26\x10\x7C\xD1\xAA\xC9\x73\xCF\x13\xD9\x75\xD4\x76\x91\x97\x8D\xD1\x71\x1E\x2D\xCF\xE7\xCE\xA3\xC2\x89\xD0\x3A\xF4\x9D\xD1\xCB\xAA\xD0\xB1\xC9\x53\x14\xAC\xC1\x8B\xC6\x2B\xF3\xA2\xE8\xCA\xA0\xD0\x5B\xD2\x28\xD4\xE7\x1A\x66\xDB\x45\xDD\x94\xBD\xD1\x1E\xCC\x31\xD1\xD0\x29\x18\xD1\xD3\x14\x2B\xD6\x04\x1C\xD1\xDA\xB6\x4F\xD0\x32\xD5\x16\xD5\x00\xB7\x45\xD6\x94\x9A\xCE\x90\xD1\x8F\xC8\x34\xD7\xF9\xC2\x8D\xD3\x3C\xD4\xA3\xB7\xCB\x4D\x0F\xD4\x16\x61\xCD\x18\xD7\x57\xC7\x46\xF9\x95\xC9\xD1\xDD\xD1\x65\xD0\xD1\x18\x0E\xD3\x7F\xC3\x7A\x23\xA3\xC0\xCC\x17\xD0\x73\xD3\xD5\xC8\xD7\x10\x75\x16\x2C\xD2\x55\x58", "\xD1\x0C\xB8\x6D\xD3\x3B\xD4\x1B\xD9\x7C\xD6\x28\xE1\x96\x97\x21\xA6\xD0\xF3\xCA\x2A\xD4\x0B\xD7\x8E\xD8\x44\xF9\x18\x7D\x17\xA8\xCA\x30\x04\x40\xD6\x83\xB2\x90\xCA\x2C\xC4\xA4\xC8\xCA\xB1\xCA\x75\xCF\x46\xCF\x1E\xD6\x81\xC5\x47\xD3\x9F\x8D\xD2\x0B\x1A\xA8\x0E\xDA\xCA\x20\x23\x91\xC4\xF2\x9A\x6F\xDF\xCB\x17\xD3\xC9\xCC\x2E\xD7\x1F\x03\x5C\xC8\x48\xE2\xA3\xA7\xD1\x57\xD1\x28\xD1\x3A\xD3\xCC\xC8\x8E\xCA\x3D\x0A\x97\xEC\xD1\x88\xCA\x77\xD2\x45\xD2\xFB\xC2\x88\xDC\x37\xEB\xA4\xB3\xCF\xA5\xD1\x97\xD2\x42\xD0\x15\xDC\x7F\x20\x49\xFC\xA3\xB9\x0C\xAA\x0F\xED\xC8\x4E\xD1\xB3\xCA\x93\xDB\x2C\xCA\x9B\xC2\xD0\xF8\xCE\x8B\xC9\x79\xCF\xE2\xCD\x51\xC8\x44\xFE\xA2\x9A\xCA\x25\xD2\x05\xCC\xCF\x1B\xBD\xC6\x04\x21\x29\xD6\xA5\xD1\xD1\x85\xCF\x58\xD3\x4A\xD1\xBE\xC7\x89\xDF\x28\xDF\xA5\xE4\xD1\x61\xD3\xC9\xCC\x1D\xD6\xBD\xC6\x51\xD8\x2F\xEE\xA4\xBC\xD1\x30\xD2\x52\xCC\x06\xD4\x26\xDE\x90\xCB\x0C\x27\xA1\x83\xCC\xB6\x31\x02\xCC\x3C\xD1\x2B\xDF\xF3\x0B\x49\xE5\x94\xBA\xCA\x50\xD0\x05\xD3\xF4\xC9\xA5\xC5\xE1\x1F\x43\xE4\x5B\x29\xD2\x83\xD2\x9E\x1E\x4C\xCD\x0A\xD5\x95\xC1\x4C\xF9\xA3\x89\xD3\x2B\xD3\x47\xD0\x00\x05\x1E\xDF\xF3\x1C\x48\xCA\xA3\x9E\xD2\xC0\xD1\x7D\xD3\x25\xD1\x13\xD6\x8B\x00\x2A\xD9\xA5\xBD\xCB\x46\xCA\x28\xD0\x2E\x2B\x25\xD4\x8A\xC1\x47\xF0\xA5\xD0\xD2\x31\xD3\xEF\xCE\x66\xD3\x15\xD9\x96\x0D\x45\xEF\xA2\x9F\xD3\x4D\xD3\xD6\xCA\x68\xD3\xBC\xC8\xF4\x1A\x45\xC1\xA5\xA7\xD3\x54\xD3\x78\xD0\x66\xD0\xDC\xC6\x94\xDB\x4C\xF9\x18\x63\xCA\xBB\x3C\xD8\xD3\x8A\x20\x25\xDC\x93\xC1\x45\xFE\xA4\xED\xCA\x1A\xD2\x8D\xCA\x65\xD2\x37\xD9\x96\xDF\x48\xEB\xA6\xBA\x0E\xD6\xD0\x58\xD2\x5A\xD3\xA8\xC1\x9B\xDE\x2D\xF3\xA6\x8E\xCB\x44\x1E\x70\xD3\x64\xD5\xA6\xCB\x9C\xDC\x52\x3F\xA2\xBC\xD3\xCF\xD2\xE3\x19\x61\xCD\xAE\xCB\x94\xDC\x2D\xD5\xA7\xA1\xD3\xA8\xD2\x99\xD3\x4A\xD4\x1E\xDC\x9D\xCE\x4C\xFB\xA6\xFC\xCD\xBD\xD2\xD6\xD0\x43\x1B\x31\x0E\x8F\xC8\x0A\x02\xA7\xA7\xD2\xB4\xD1\xE2\xD3\x65\xD3\x09\xDB\x92\xC7\x48\xCE\xA3\x9C\xCA\xDD\xD2\xA2\xD2\x4C\xD1\x3E\xDA\x73\x10\x48\xE4\x55\x67\xCF\xD3\xD2\x59\xD3\x70\xD1\x3F\xDF\x94\xD9\x4D\xC3\xA1\xAB\xD2\xCE\xCF\xFF\xD3\x46\xD6\x3D\xDD\x9C\xD9\x4C\xD5\x9E\xA1\xD2\x0F\xD2\x9C\x16\x6E\xCD\x3C\xDC\x5C\xCB\x50\xDB\xA3\xFA\xD3\xCC\xD3\x07\xD6\x45\xCD\x25\xD2\xA1\xCA\x4E\xD4\xA8\xDF\xD3\xF0\xD3\xF0\xD1\x5A\x16\x26\xD6\xCF\x17\x4F\xD5\xA4\xCE\xD2\x5C\xD1\x9F\xD1\x72\xD1\xA3\xC1\xA0\xC9\x4D\xFF\x8C\x97\xD4\x47\xD3\xC5\x01\x52\xD7\x95\x2C\x06\x0E\x51\xDE\x70\xC4\xD3\x0D\xD5\x9E\xD0\x7F\xD2\x2A\xD9\x7A\xC7\x29\xE7\xA8\xD8\xD2\x1C\xD4\xB6\xD3\x56\xD0\x87\x26\x96\xC7\x52\xD9\x94\xD4\xCA\x63\xD3\xAB\xD1\xBD\xC9\x3D\xD2\x98\xD1\x2E\xEB\xA5\x84\xD1\x44\x1E\xB7\xD1\x89\xD4\x46\xDE\xA4\xC2\x1A\xE3\xA1\xE0\xD2\x3A\x0F\xBB\xD1\x46\xCC\xC0\xC6\xFE\x3D\xAC\x06\x98\xD7\xD3\x20\xD5\x2B\xD6\x9A\xD2\x0E\xDB\x92\xDA\x52\xF7\xA6\x8D\xD3\x49\xD0\x1C\xD6\x6F\xD6\x2E\xD8\xA6\xC1\x52\xF5\x97\xF6\xD0\xEF\xCE\x3C\xD2\x79\xCC\xA6\xC8\xA4\xC9\x50\xC2\x8D\xFE\xD0\xE4\x62\x96\xC8\x7A\xD6\x41\xDD\xF3\x38\x52\xDB\x42\x06\xD1\x5E\xD3\xD4\xCC\x9F\xD7\x49\xDC\x87\xD1\x4C\xF3\xA8\xD5\xCF\x8A\xD4\x01\xD6\x6A\xD2\x4E\xD2\x9F\xDC\x4C\xE9\x2E\x1E\xD3\x49\xD5\x4E\xD3\x8F\xD4\x41\xD1\xA3\xC3\x45\xCF\xAA\xC7\x1E\xCB\xD3\x45\xD6\x97\xD3\x1A\xDA\xA2\xD3\x4F\xE5\x01\x2E\xD3\xB3\x04\x1F\xD6\x49\xD0\x48\xDD\xA9\xDC\x79\x36\xA6\xA6\xD3\xCF\xD1\x48\xD6\x8D\xD0\xF8\xC5\xAA\xD0\x3A\x00\xA7\xE1\x41\xAA\xD4\x2C\xBE\x14\x1C\x53\xD5\xA7\xCB\x49\xCD\xA3\xEF\xD4\x00\xD4\x59\xD6\x5C\xD2\x1F\xD4\xA9\xD0\x4E\xF8\x50\x64\xD3\x7E\xD5\x76\xD2\x87\xD3\x20\xD0\xA2\xC5\x48\xFE\x95\x9F\xD5\xF6\xD0\x61\xD5\x95\xD0\x3C\xD5\xAC\xC2\x4F\xF6\x22\x6B\xD1\xC9\xD5\x9C\xD3\xB2\xD3\x27\xD6\xA7\xDB\x4F\xE2\xA8\x8F\xCB\xD0\xD5\xCA\xD2\xB4\xD7\x31\xD6\xA1\xD4\x4B\xD8\xA8\xF4\xD3\x7E\x25\xA8\x2A\x7D\xD1\x53\xD9\x8D\xDB\x54\xDF\xA8\xDD\xD5\x21\xD5\xA8\xD0\xCF\x1E\x3F\xD0\xAC\xD3\x50\xFB\xA9\x92\xD5\x37\xD4\x73\xD5\x8E\xD7\x54\xD7\x5A\xC7\x50\xF9\xAA\x9A\x08\xBC\xD5\xF4\xD3\x68\xD1\x23\xD9\x5F\xC6\x51\xF7\xAB\xB3\xD5\x1A\x1D\x5A\xD5\x86\xD7\x79\x6B\xA1\xD9\x56\xCC\xA5\xDB\xD5\x30\xD5\x5E\xD7\x88\xD1\x5C\xDB\xF3\x01\x55\xF8\xAB\xB4\xD5\xD5\xD5\x15\xD5\x72\xCD\x45\xDC\xAE\xC1\x48\xEE\xAB\xCC\xD5\xF0\xD4\x67", "\xD4\xD1\x18\x28\xD0\xAB\xC1\x56\xC7\xAC\xC3\xD5\xCE\xD3\x8C\xD6\xA9\xD3\x47\xD7\x9A\x1F\x57\xE1\x31\x6F\xD5\xAD\xD4\xA2\x1F\x54\xD2\x48\xD6\xA4\xC7\x59\xD3\xAB\xFC\xCD\x1D\xCB\x95\xD0\x57\xD4\xE9\x17\x88\xC3\x57\xEF\xA7\xCB\xD0\x5A\xD2\xA2\x1C\x59\xD2\x3E\xDD\xA4\xD6\x59\xE4\xAB\x83\xD1\x6B\xD4\x9B\xC8\xCF\x1E\x4D\xD5\xB2\xD6\x57\xF9\xA6\xA2\xD5\x7B\xD1\x05\xD2\xC2\xD4\x4E\xD2\xB0\xD0\x47\xF2\x9B\xF9\xD2\x65\xD5\x2D\x08\x62\xD6\x4A\xD3\xF4\x0B\x49\xFC\x9F\xBD\xD6\x21\xCB\x90\x1D\xA8\x4A\x01\x4B\xB5\xC8\x5A\xC9\xAD\xE7\xD6\x6A\xD1\x95\xD0\x05\xD0\x6C\xD0\x52\xCA\x25\xED\xAB\x64\xD6\xCD\xD5\x8E\xD4\xDA\xD3\x6E\xD3\x87\xCB\x49\xDF\x1C\x14\xD3\x3B\x1E\x42\xCF\x14\xD6\x69\xC0\x8D\x21\xF9\x21\xAC\xF2\xD6\x74\xD7\xC0\xD7\x9D\xD4\xE7\x19\xCA\xB4\x57\xC2\xAE\x87\xD7\x87\xD7\x95\xD0\x09\x61\x42\xD8\xB8\xCD\x5C\xE7\xAD\xFE\xD2\x27\x02\x12\xD6\x47\xCA\x6F\xD6\x74\xC1\xCE\x9B\x59\x7B\xD2\x80\xD6\xC7\xD6\xE6\xD5\xA2\xCC\xF3\x04\x81\x4B\x9F\xD3\xD4\x20\xCA\xF6\x17\x5A\x50\xD5\x25\xB6\xD8\x59\xDB\xAE\xA7\xD7\x7D\xD2\x8B\xC8\x09\x64\x64\xD8\xBA\xCD\x5D\xD7\xA9\xAB\xD2\x7D\xCC\x83\x03\xCC\xD6\x75\xD4\xBB\xD5\x5D\xF6\xAE\xB5\xCA\x2B\xD3\x9A\x8A\xE8\xC9\x0E\xD0\xBB\xD9\x22\xF7\xAE\xBF\xD7\x21\xCB\x95\xD0\x92\xCB\x3B\xD0\xBC\xC5\x5E\xCE\x98\x8B\xD3\xD8\x2C\xE3\xD6\xF2\xD1\x67\xD8\xBC\xC6\x08\x3D\x5B\x4B\xD7\xD0\xD6\x25\xD4\xD1\x19\x95\xBC\x75\xD1\x5E\xCE\xAE\xAB\xD2\x40\x21\x11\xC0\x7D\xCB\x25\xD0\xF7\x0F\x21\x47\x3D\x40\x20\xEB\x01\x50\xCF\x49\x01\x7C\xD1\x52\xD3\x7B\x41\xA0\x92\xD5\xB6\x39\x7F\x02\xF2\x1D\xEC\x17\x19\x32\x2C\xFB\xA0\x81\x02\xE9\x00\xCA\xD5\xF3\x45\xDC\xC1\xAE\x33\x33\xDC\x30\x69\x2E\x57\xD6\x5B\xAC\x28\x37\x06\xD0\x47\xC0\x4C\xEE\xA0\x82\x02\xF1\xD7\xF2\xD4\x21\xAB\xCE\xCB\x30\x23\x4F\x39\xAF\xE7\xB1\xFB\xD7\xB2\x1E\xC5\x3C\xB6\xCC\x98\xC0\x00\x01\xB0\xA0\xCA\x73\x5E\xFB\xD4\xCE\x16\x0C\xD9\x78\xDD\xA1\x9A\x9E\xE5\x1E\xEC\x9F\xC0\xCB\xFF\xD0\x7E\xD2\xBF\xC1\x66\x74\xAF\xA0\x31\x12\xD9\xE7\x64\x05\xD8\xF3\xCA\x78\xD7\x60\xE7\x04\x3D\x23\xEE\xD6\x24\xD2\x41\x07\x81\xDF\x51\xD1\x60\xFD\xA9\xCC\x3E\x8B\x43\x03\xDB\x07\xDF\x12\x3C\xBF\xC5\xBB\x3E\xAF\xEF\xD7\x0E\xD9\x0E\xD9\x35\x5B\x86\xDC\x8B\x3F\x41\xCB\x44\xC1\xD0\xE4\xCC\x81\xCE\xB9\xCD\xEC\x1F\x3E\x74\x42\xDB\xB0\xB9\xD8\x02\xD8\xFD\xD7\x25\x37\xD6\xC5\xC0\x16\x1B\xD5\xB0\x8C\xAE\x43\xD9\x93\x01\x75\x21\x85\xD0\x86\xC9\x08\x2C\xB0\x9E\xCA\x2E\xD9\x8C\xC8\x77\x1D\x6F\xCF\xC4\xDB\xBA\x89\xB0\xA7\x02\xDF\x22\x2A\xDB\xBB\x17\x24\x07\xC5\xDD\x28\xD9\xB1\xC2\xC6\x5B\xD8\xC2\xC5\x17\xDF\x18\xBD\x85\xC9\x08\x2C\x47\x62\xD8\x02\x16\x32\xDA\x0E\xDB\xFE\x5C\xC3\xD5\xC6\x0C\xB1\xC4\x1C\xD2\xCC\x12\xDA\x05\xDD\xD9\xC6\xBD\xDD\x63\xCA\xAD\xC4\x1E\xB1\xD7\x07\x0E\x1F\xDD\x71\xDB\x92\xDC\x52\x3D\x4A\x21\xCA\xCB\xD3\xA6\xCF\x0B\xDB\xEB\xCB\x51\xD8\x47\x12\xBA\x5C\xD8\x02\xD6\x5B\x3A\x2A\xD0\x2C\x20\x07\x0B\x49\x0B\xBA\x55\x31\x6C\xCE\x8B\xCB\x4B\x17\x90\xD9\x90\xD9\x4D\xCA\xB2\x8C\xD5\x32\x65\xEA\xD6\xD0\xC6\x91\xD4\x81\x9E\x3E\xD2\xB2\x9A\xCA\x94\xD9\x95\x10\xF1\x06\xD2\x5C\x8B\x34\xCA\xA2\x94\xF8\xD4\x06\x02\x41\x24\x22\xD9\xF5\xCF\xC9\xC3\x55\xE1\xB2\xDC\x14\xE4\xD6\x94\xD4\x23\xDA\xA3\xCA\xE0\x06\x4C\xE8\x59\x61\xC6\x7A\xD8\x28\xD9\xB8\x37\x8F\xDB\x09\x24\x81\x7B\xAC\xB1\xD5\xE6\xCB\x5A\xD9\xD4\xD2\xC3\x90\x03\x18\x65\xF3\xB1\xAE\xD9\x1A\xCB\x15\x61\xE3\xA1\x81\x0F\x38\xB9\x63\xC1\xB1\x99\xCF\xCD\xCD\x95\xD1\x2A\xBB\x68\xDF\x85\xDB\x4F\xCA\xB3\x8B\xD1\x17\x75\x66\xDB\xF8\xD7\x99\xD1\xCE\xD1\x7B\x0D\xAF\x83\x02\x0A\x24\x38\xD8\x97\x17\x9B\xD0\x65\xC1\x67\xCE\xB3\xA9\xD3\xB6\x38\xE6\xD4\xCF\x1D\x7D\xD6\x10\x1C\x64\xC2\xA5\x9E\xD9\xE8\xD6\x60\x39\x23\xDD\xA6\x05\xCA\xC2\x4D\xE7\xB2\x99\xCA\x94\xD8\xA5\x22\xD0\x31\x93\xDC\xF3\x11\xB8\x02\xB2\xA0\xCA\x30\x0F\x75\xD9\x3E\xD9\x4B\x4F\xCE\xDA\x65\xDE\x66\xE3\xCE\x8B\xD8\x08\x9F\xBF\x11\x81\x28\x3E\x13\x7B\x5B\x94\xF7\x17\x3A\x61\xEF\xA6\xE4\xC3\x8D\xD7\xC5\x2B\x49\xCB\xB0\xFD\x18\xB3\xD9\x64\xDB\x42\xDA\x9C\xD9\x10\x19\x65\xF7\xAC\xDD\xB3\xFA\xD8\xEA\xD3\x8A\x25\x23\x3C\x0E\x70\x64\xD7\xB3\xA5\xD8\xB0\x41\x95\xD1\x06\xDF\xA0\xDF\x51\xC9\x68\xF1\x41\xA3\xDA\x0D\xDB\x93\xD8\x74\xA0\x98\x3A\x8A\xCD\x40\xDE\x26\x2A\x0F\x4B\x60\x8B\xDA\x46\xC8\xA3", "\xD5\x04\x7A\x68\xD8\x8E\x9C\xDA\xD5\xCC\x8B\xC8\x0A\xDC\xBF\x01\x52\xD6\x69\xD1\x52\x38\xDA\xE3\xD8\x78\xD8\x4F\xD9\xA2\xD4\xED\x9F\x57\x28\x50\x70\x31\x42\xDB\x8C\xC8\x51\xD9\x0A\x68\x36\xC8\x6A\xDA\x9E\x96\xCA\x40\x3F\x50\x23\x0D\xDA\x48\xDC\xCE\xC1\x33\xEE\xB3\xD1\xDA\x0E\xDA\xD7\xB1\x96\x46\x9C\xDC\xF3\x13\x62\xFC\x5D\x63\xDA\xC6\xD3\x89\x88\x54\xDD\xA4\xD4\xCE\xC1\x65\xEC\x9A\xFF\x01\x61\xD9\xC1\xCC\x5C\xDE\x9B\xD3\xD7\xC6\x08\x26\xB4\xC7\xD6\x6A\xDA\x18\x00\x5E\xDF\x24\x03\x77\xC6\x58\xF8\xB3\xD2\xDA\x0C\xDA\xB4\xDA\x4E\xDA\xEC\xCC\xA5\x05\x63\xDC\x94\xD9\xDA\x2B\xD3\x74\xDA\xD4\xCC\x6D\xD4\xD6\xC3\x69\xFA\xAC\xA7\x02\x1E\x25\x90\xDB\x61\xD9\xAD\xD8\xD2\xC9\x6C\xF4\xB5\x88\xDB\x24\xDB\x15\xDB\x1C\xDB\xDE\xC6\x51\xD9\x6C\xC6\x04\x62\xC2\x7A\xD5\xCD\xDB\x62\xDB\x9E\x49\xD3\xC0\x6C\xDD\xB6\x82\xDB\x16\xCB\x14\x25\x42\x07\x4B\x2A\xCE\xD7\x69\xE0\xB6\xAD\xDB\x3F\xD7\x9D\xD9\x96\x43\x25\xDB\x77\x23\x08\x0F\xD5\x77\xD9\x95\xDB\xDB\xDA\x62\xDE\xB5\xDA\xDB\xC1\x6D\xC3\x04\x0E\xDB\x1B\xCA\xA1\xDB\x4A\xD0\xB5\xDC\x9A\x1B\x6B\xCC\xA7\xE5\xDA\xA6\xD8\x60\x38\x6E\xDD\x42\xDF\xD0\xCB\x49\xF4\xB6\x86\x02\xD5\x5F\xD4\xD9\x70\xDC\xB3\xD5\xDC\xD3\x6E\xE8\xA8\xAF\xDB\x6B\xD3\x95\xD1\xC9\xAF\x31\x2D\x9E\xC2\x69\xC2\xB7\x9F\xDB\xDC\xDA\xC6\xDA\x1C\xD9\x89\xD8\xC0\xD7\xC4\x01\xAD\x9B\x21\x34\x55\x26\x01\x79\xDA\xB5\xD4\xDC\xCA\x6F\xE8\xB7\xAB\xDB\xCF\x42\xE3\xD8\x00\xDB\xB4\xD4\x48\xAD\x53\xEE\x18\x35\xDA\xB4\xD9\xBE\xDB\x40\x07\xAF\xD9\xDB\xC2\x3B\xE2\x9B\xE8\xD1\x32\xD8\x21\xDB\x30\xDA\xA3\xCB\x9F\x05\x30\xC0\xB3\xAF\xDA\x7B\xD9\x81\xCE\x45\xCA\x5A\xC0\xD2\xC8\x68\xC1\xB8\xE7\xDB\x7E\xDB\xBA\xD8\x33\xDF\xC0\xD5\x97\xD0\x57\xD9\xB5\xC2\xC6\x2E\x19\xA3\x32\x0C\x1D\xAB\xD1\xCC\xDE\x62\xF4\xB0\x96\xCA\x89\x28\xEC\x09\x4D\xCE\xA9\xD6\x10\x10\x6E\xFE\xB3\xD2\xDB\xC3\xDB\x02\xDF\x3C\x49\x0B\xDC\x78\x3B\x42\xDE\xB5\xFC\xD8\x19\xCA\xDA\x16\xBA\xD6\xC4\x59\xE0\xD8\x66\xD2\xB8\xBC\x1E\xA6\xC9\x6B\xCF\x6A\xD2\xA1\xD8\xE1\xC3\x70\xDA\xB8\xDB\xCE\x34\xDC\xA6\x3E\x8D\xDD\xC4\xDC\xC6\xD7\x68\xCF\x30\x5E\x60\x74\x63\xA3\xD8\x93\xDD\xA3\xD6\x51\xD3\x03\x3F\xB7\x9E\xCA\x2C\xDC\x02\x4E\x80\xDA\x20\x04\xE0\xD4\x6E\xC1\xB6\xC9\xDC\xA5\x87\x25\xDC\x84\xDA\x98\xD0\x8A\x24\x4C\xCF\x34\x13\x32\x93\x63\xCF\xC4\x69\xDC\xE7\x1D\x3C\xC3\x53\x02\xA8\xDA\xDC\x45\xDC\x2E\xDF\x91\xDF\xA1\xDD\xD8\xDC\x6F\xCA\xB1\xBD\xD8\x54\xDB\x02\xA2\x98\xDA\xEF\xCD\xEE\xA6\x9B\x8E\xB1\x99\xCA\xBF\x12\xD0\x54\x37\xB7\x73\xC7\x35\xDF\x73\xDA\x94\xAB\xD2\xB5\x0E\xFA\x63\x20\xD8\x75\xD8\xBD\xC7\x09\x13\x01\x14\xDB\x1E\xCB\x1B\xC8\xC4\x62\xE7\x14\x43\xD6\x4F\x12\x1D\x3C\x1E\x70\x1E\x09\x95\x92\xCC\x9B\x5B\x02\x27\x5F\xC0\xBA\xD7\x06\x9E\x4A\x4A\xDD\xB7\x91\xE3\x4F\x92\x10\xF3\x9F\x94\x95\xDD\xAC\x2A\xBC\xD6\x5F\x1D\xCA\x0A\xF3\x0D\x20\xCD\x06\x70\x1E\x41\xA0\xC0\xCD\x1B\x05\xD3\xD5\x53\xD2\x74\xE2\xC9\x22\xDD\x42\x8A\xCF\x4B\x4B\x13\xD6\xD1\x52\xC8\x75\xC5\x34\x2A\xDD\x98\xCC\x95\x1A\xCE\xC9\xE9\x8E\x5B\x4C\x35\xF7\x3F\x80\xCF\xD1\x00\x29\xD7\x9F\xD0\xD4\xD8\x43\xD4\x32\xF3\x1A\xD6\xCC\xA4\xDD\x93\x01\xB2\xDD\xD7\xD3\xEA\xD0\x98\x40\xBB\xA8\x1A\xA8\xCF\xCA\xD4\x42\xC5\x53\x6A\x8A\xD2\x41\x0F\xBC\x50\x16\x46\x3A\x1E\xCA\x5F\x00\xEE\x13\x30\x20\x5D\xC3\x04\x40\x01\x4C\xD5\x48\xDC\xB3\xDB\xD2\xDE\xEC\xD0\x26\x3E\x9B\x51\xDD\x09\x02\x74\xDC\xB5\xD9\xD7\xD9\x71\x57\x76\xFC\x75\x59\xDD\xD7\x22\x92\x64\xAF\x4C\xD5\xC5\xEE\xCB\x33\xC6\x04\x1D\x01\xE9\xDD\x8E\xCA\xAD\xDC\x70\x78\xEB\xDE\x47\xBA\xBA\xA7\x02\x00\xDF\x79\xDE\xC1\xDD\xDE\xD7\x73\xC1\x76\xE2\x2E\x3A\x1E\x63\xC8\x11\x12\xB1\xD8\xDD\xC3\x10\x1B\x04\x01\xBC\x9C\xCA\x03\xDE\x3F\x95\xC1\xDD\xCA\xCD\x78\x27\x78\xC9\x04\x16\xDE\x0A\xDE\x8E\xDD\x34\xC6\x22\x06\xEF\xD5\x3F\xC2\xBB\xBB\xCD\x8C\xB1\x5E\xCC\xAC\xDC\xE2\xD2\x10\x19\x04\x17\xBC\xE6\xDC\xD8\x13\x66\xDD\xCC\x7A\xE4\xDE\xF1\xC6\x08\x2E\xBC\xA1\xDE\xCF\xDD\x8E\xDC\xC3\xD9\xA3\xCB\xEA\xDD\x35\x03\xBB\xE7\x67\xC5\xDD\x4C\xDC\xCB\xD9\x20\x0B\x21\x9D\x4A\xE0\x94\x99\xDE\xAB\xC0\x8B\x03\xC6\xD9\xE7\xD3\xF2\xD4\x03\x2F\x24\x45\xDE\x1E\xCA\x5F\xDD\x09\x15\xE4\xD7\x74\xD6\x3F\xC2\x9F\xB3\xC7\x8F\x4B\x89\xDE\xB9\xDA\x20\x09\x08\x0A\x76\xC7\x3D\x48\xDE\x35\xC8\xA5\xDD\xBB\xDC\xA8\x0F\xEE\xD0\x98", "\x6F\x24\x5D\xDE\x38\xDE\x77\xDC\xB4\xDE\xDA\xDD\xF0\xD8\x76\xD6\xBD\xA6\xCF\x29\xDF\xF1\x11\xB7\xDA\xA3\x1F\xF0\x46\x21\xC8\xCC\x62\xDD\x52\xDD\x45\xDF\xEF\xD3\x25\xDC\x63\x11\xF6\xAC\xA1\x96\xCA\xA9\xB9\xF3\x5F\xE4\xD1\xF5\xC9\xCA\xBB\x28\xF8\xBD\x9F\xC7\x83\xD9\x95\xD2\x0C\x2B\x53\xAE\xDC\xDC\x52\x05\xBE\xED\xDE\x8D\x66\x47\x2C\x87\xDF\x5C\xD0\xAF\xC3\xFE\xB7\xEC\x2B\xD2\x34\x55\x80\xA4\x9C\xD1\x37\xDF\xF8\xDC\x79\xCC\xEA\x77\x05\xC7\xD6\x9E\x1D\xED\x09\x47\xCA\xF7\xCB\x74\xF9\xAE\xA7\x02\xF1\xC5\xB4\xD6\x45\xC9\x90\xD8\x23\xA5\x7D\xD6\xAF\xDA\xD9\xD4\xBA\xD7\xDE\xE9\xDF\x9C\xDD\x1F\xB2\x7D\xC6\xAF\xA7\xDF\x09\x02\x14\xC7\xF6\xD0\xF0\xD7\x12\x04\x56\xB6\xBE\xB4\xD7\x7C\xDF\x93\x02\xDF\x27\xF7\xD0\xBC\xC8\x74\xE7\x04\x08\x84\x6C\xD4\xB8\x1F\x3F\x01\x95\xB2\xAE\x9B\x28\xD9\xB9\x82\x02\xAF\xD5\xC7\xDA\x15\x3E\x2B\x5B\x51\xDB\x25\xC4\x08\xD7\xC9\x70\xDF\x5D\xC2\x55\x52\x15\xDD\xC4\x09\x49\x5B\x08\x65\xCF\x11\x52\x2E\xB9\x82\x0A\x15\xDB\x11\x3A\x12\xDA\x30\x0B\x12\xFD\x50\xF1\xDF\x19\x03\xF9\xD7\x12\x05\x9D\x09\xAA\xE6\xCB\xD1\xDF\xE4\xDB\xF4\xDB\x76\x64\xFC\xC1\x5E\xD6\x94\xA3\x0D\x20\xCF\xFA\xDE\xED\xD3\x25\xD5\x4E\x10\x57\xFA\xBF\xC5\xD7\x90\xD7\x3C\xD6\x75\xC9\xF5\xC0\x87\xDF\x6E\xC3\xA1\xB0\xDE\xCC\x13\x95\xC8\x20\xD0\x73\xDE\xB0\xCC\x6B\xC4\x3D\x08\xD5\x20\xCB\xB3\xD1\xDE\xA7\x62\xD1\x5C\xC0\x64\xFE\xAE\xEB\xD0\x8E\xD5\x82\xD4\x97\xD6\xBC\xC5\x00\xF9\x73\xD5\xA2\xD3\xD6\x33\xD3\x85\x18\xA6\xD5\x01\xED\xA1\xD8\x4F\xF0\xAC\x92\xD6\x4A\xCA\x8A\xD6\xED\xCC\x03\xE4\x01\xE1\x81\xC8\x9B\x9D\xDC\xA8\xD5\xA9\xC9\xE6\xD0\x34\xD1\x88\xD1\x6B\xDF\xAB\xC4\x1E\xD1\xDE\xBC\xD7\x0A\xE1\x37\xDD\x01\xE0\x65\xE9\xAC\xFA\xD5\x73\xD4\x55\xBF\x30\xD1\x38\xD3\x03\xE7\x4F\xF5\xC0\xDE\xD5\xF2\xD4\xA2\x1F\xAF\xD5\x69\xD6\xD8\xC2\x52\xFD\xC0\xB6\xD9\x3F\xE0\x53\xCC\xE5\xD9\x3A\xDE\xB2\xC1\x08\x2C\xAA\xA8\xE0\xD9\xD2\x15\xE3\xC5\xDC\x4B\x1F\x04\xEB\x66\xE5\xAB\xD2\xE0\xFB\xD5\xF1\xD3\x35\xD5\x08\xE0\xB1\xD2\x4D\xD5\xAD\xD8\xD3\x9B\x20\xF6\xD2\x66\xDE\x09\xED\x02\xE4\x50\xC6\x37\x75\xD3\xD2\xD3\xC4\xD2\x82\xD6\x04\xE0\xB2\xD1\x59\xDB\x42\x06\xD7\xC4\xD7\x4E\xD8\x1B\xE0\x61\xDE\x02\xF8\x2E\xEC\xA2\xFD\xD5\xC2\x3E\x04\xD6\x1C\xE6\x18\xD5\x06\xF6\x4E\xE7\xC1\x95\xE0\x9B\x20\xC6\xD4\x13\xE3\x03\xEC\x03\xED\x83\xE0\xC0\xA3\xD2\x86\x07\x2A\xE3\xAE\xD7\x04\xE7\x08\xF2\x2E\xC2\x97\xDA\xE0\x7C\x1E\x02\xE2\x23\xE2\x65\xD6\xA9\xCD\x63\x37\xA4\xA4\xE0\xDD\xCB\x8F\xD4\xB7\xD6\x0E\xE8\xF4\x0C\x5D\xFA\xC0\xDB\xE0\x27\x03\x2E\xE0\x38\xDC\x58\xD0\x04\xF5\x54\xC8\xA5\xDA\xCB\x3C\xD4\x49\xE3\x15\xE5\x12\xEB\x92\xD3\x5D\xFB\xA7\xB5\xD6\x8D\xE0\x3E\xE2\x3C\xDA\xBD\xCF\xF2\xC3\x7A\xCC\xA7\xAA\xE1\xED\xD9\x04\xD5\x94\xD0\x2C\xD8\x0B\xFB\x83\xE9\xB7\xBA\xCF\x73\xD6\xFF\xDA\x06\xE0\x52\xDC\x02\xFC\x83\xD3\xBE\xFB\xD5\x62\xD4\xA1\xC4\x99\xD0\x8A\x06\xA6\xCC\x80\xC3\xC2\xAA\xDF\x3C\x1E\x08\xCF\x29\xE1\x4E\xD0\x52\xC1\x79\x20\x7C\x2C\x2E\x7F\xD6\x50\xE3\xFF\xDF\xD0\xD0\xCB\xD1\x3D\xDA\xB7\xF1\xDA\x8A\xE0\x2F\xDC\xD0\xD5\x0F\xD5\x98\xC1\x54\xCB\xC0\xA5\xD7\xEB\xE1\xF7\xD8\xD2\x1B\x78\xDB\x0D\xEF\x4B\xE5\xA5\xC3\x1E\x06\x17\xF1\xCC\x50\x00\xFC\xD9\xF3\x39\x4A\xDC\x9F\xDF\x3E\xE1\xE0\xC8\xD0\xED\xDB\x8C\xDF\xFE\xD9\x4D\xE9\xC3\x86\xE0\x85\xD4\x07\xE3\x26\x22\x32\xD5\x0F\xE6\x7A\xC2\xA9\x87\xE2\x1E\xE1\x54\xD0\x08\xE2\x13\xD2\x21\x12\x85\xC1\xAC\x84\xD5\x36\xD0\x4F\xD7\x32\xE0\x54\xD9\x7A\xD0\x88\xFE\xC0\xDF\xE0\x2F\xE0\xCA\xDD\x0C\xE1\x0E\xEC\xB5\xD3\x83\xEF\xA8\xE6\xE0\x18\xE2\xF5\xD0\x57\xC8\x13\xEC\x5E\xC6\x88\xDB\xC2\xAD\xE1\x3A\x0F\x5B\xD4\x6A\x56\x22\xE4\x09\xE9\x89\xC3\xAC\xCC\xD1\x2C\xE2\x87\xE0\x3A\xE7\x25\xE0\x06\xE1\x82\xD4\xC1\xE4\xE0\x74\xE1\x51\xE0\x16\xE3\x13\x2A\x9D\xCD\x88\xFC\xAC\xE6\xCB\x1E\xE2\x28\xE0\x48\xE6\x0F\xE5\x93\xD7\x56\xC8\xAB\xD7\xE1\xDA\xD5\xA0\xE1\xC4\xD4\x16\xE6\x51\xCA\x83\xFA\xC1\xBB\xE2\x7C\xE0\x37\xE1\x5A\x10\x0E\xE4\x13\xF5\x83\xC3\xC5\xC8\x1E\x78\xE0\xA3\xE1\xD6\x1D\x23\xEC\x13\xE1\x89\xFB\xAB\x86\xD4\x81\xE1\xAE\xE2\x50\xE4\x2A\xEC\xF3\x09\x87\xE2\xC5\xE6\x1E\x64\xE3\xAC\xE3\x23\xE2\x43\xD8\xE6\xCA\x8B\xD3\xC5\xB6\xE2\xB4\xD3\xC6\xC6\xE4\xD3\x11\xEC\x0C\xEE\x89\xF2\xC5\x9C\xE1\xAF\xE1\xD4\x17\x27\xE0\x2A\xEF\xB0\xD2\x8A\xE8\xC4\xC2\xD4", "\x37\xE1\x4D\x22\x29\xE3\xBE\xDF\x10\xE5\x8B\xCC\xC5\x9D\xDC\x2C\xD7\x1E\xD4\x50\xE7\x24\xE6\x08\xF8\x8B\xE8\xC1\xC8\x1E\xB6\xE0\xE6\xD1\x31\xE0\x2B\xE7\x0C\xF2\x49\xFB\xC2\x9B\x21\xC7\xD8\xB8\xE1\x41\xE5\x31\xEA\x0B\xF5\x43\xFC\x3C\x43\xD6\x0B\xD3\x30\xD0\x73\xD1\x29\xEE\x05\xE6\x5B\xCF\xAE\xED\xD2\x39\xE3\xA3\xE2\x5F\xE5\x33\xE8\x4B\x2F\x86\xC1\xC1\xD1\xE1\x47\x1F\x69\xE1\x32\x1F\x4C\xD5\x09\xE3\x87\xFC\xAE\xB0\xE3\x1B\xE2\x98\xCC\x37\xE5\x27\xEE\x0A\xF4\x5A\xD6\xC6\xE9\xD4\x1C\xCB\x00\xE1\x93\xCC\x81\xD6\x5E\xCC\x5D\xC8\xC4\xC8\xE1\x9F\xDD\xA4\x12\x02\xE7\x30\xD1\xB7\xC9\x56\xC2\xAF\xB1\xE3\x25\xD6\xEE\xDF\x1F\x14\xF8\xC4\x7E\xDF\x75\x07\x9F\xFE\xE1\xBB\x19\xDE\xCD\x9D\xD6\x34\xEF\x00\xED\x60\xDB\xC6\xFB\xD3\xCE\xE3\x88\xE0\x32\xE1\x03\xE6\x0F\xE6\x59\xF9\xA6\xE9\xE3\x1F\xE2\x6A\xD4\x4C\xE6\x5A\xD7\xA9\xDB\x44\xD3\xC6\xA2\xE1\x77\xE2\xC4\xE1\x12\xE3\x13\x25\x9A\xD9\x83\xC0\xB7\xF1\xDA\xF0\xE2\xA5\xE2\x7C\xE4\x38\xE5\xA0\xD8\x59\x12\x95\xA4\xE2\xAE\xE2\x65\xD6\x61\xE5\x32\xEA\x1F\xF9\x88\xEE\xAA\xD8\xE3\xA2\xE3\xF7\xE2\x63\xE7\xF0\xC1\xD3\x12\x89\xF4\x7B\x76\xE2\x87\xE2\x1B\xE3\x7E\xE0\xE9\x1B\x04\xFE\x8F\xF8\xA6\xC2\xD4\x01\xE5\xD6\xE1\x8A\xD0\x30\xEB\x18\x1F\x89\xE2\xC3\xED\xD5\xAB\xD5\x8B\xE1\x83\xE2\x25\xEF\xAC\xC1\x8E\xE2\xAB\xCD\xE3\x13\xE5\x9E\xC9\x53\xE2\x1D\xDF\x14\xE5\x89\xC4\xC2\x8B\xE4\x83\xD5\x15\xE7\x4D\xE3\x1E\xD0\x21\xEB\x4E\xE1\xC8\xAB\xE1\x51\xE0\xB3\xE1\x10\xE4\x2B\xE7\x1F\xE9\x91\xF5\xC4\xBA\xE4\x79\xE2\x47\x21\x58\xE4\x31\xE0\x20\xF1\x91\xD0\x9D\x85\xE4\xCF\x67\x88\xD2\x20\xE6\x46\xEA\x20\xF4\x8C\xF9\xC8\x9A\xE4\x0E\xE4\xA2\x1E\x5B\xE4\x49\xE8\x1E\xEE\x92\xE0\xA9\xC6\x1B\x90\xE0\x6A\x04\x86\xE4\x41\xE8\x25\xEC\x91\xC4\x3D\x7B\xE2\x1E\xE4\x64\xDA\x84\xE7\x2F\xE3\x1F\xFA\x58\xC2\xC6\x9C\xD6\x27\xE4\x8F\xD6\x91\xE6\x2B\xEC\x16\xE3\x59\xFD\xC8\xA9\xCF\x3F\xE5\x60\xE1\x90\xE7\x31\xE4\xF9\xD1\x8C\xE3\xC9\xD7\xE4\x48\xE1\x2C\xE4\x79\xCD\x48\xDE\x0B\xFC\x52\x39\xC9\xE6\xDA\x71\xE4\xCE\xD4\x2F\xE1\x13\xE3\x1A\xED\x92\xE5\xC6\x8A\xE2\x48\x1E\xD4\xE0\xA4\xDD\x4B\xEF\x28\xEF\x8D\xCB\xAD\xF7\xE4\x30\xE4\x67\xE0\x08\xE0\x37\xE3\xF4\x1A\x8D\xE7\x7F\x56\xE1\x54\xE4\x48\xE6\x3C\xE1\xE7\xD8\x86\xCF\x30\xD8\xBA\xDA\x8D\x5B\xDE\xD5\x1F\x85\xCF\x0E\xDE\xFE\x02\x8B\xDF\xA9\xE8\xD2\x63\x0C\x10\xD4\x17\xCE\x69\x6C\x6A\xC6\x31\xEA\xC6\xA9\xCC\x71\xCE\x35\x43\x9C\xDE\x07\xD5\xAA\xC8\x35\xED\xC4\xC6\xDE\xD8\x38\x56\xCD\x7F\xE0\xF0\xCC\x63\xCD\x8F\xEF\x24\x45\xE5\xF8\xDB\xDA\xE1\xAF\xE4\x1B\xDE\xC4\xAC\x44\x30\x3D\x43\xD7\x80\xCF\x25\xCD\xAE\xE4\x91\x0B\x2B\xEB\x42\xF6\xC6\xF2\xD3\xBE\xE4\x8E\xDC\xCD\xD9\xE3\x4C\x6A\xD1\x7F\xEA\xC6\x9F\x74\xC6\xE4\x2E\xCE\xA6\xE2\x65\xD9\x2D\xFE\x60\xDE\x4E\xE7\xCC\x70\x1F\x0E\xE4\xE0\xCA\x01\x02\xBE\xCF\x33\xF4\xC6\xB6\x05\x04\xD9\x3A\xCE\x1F\x57\xCE\xCE\xEC\x2A\x39\xF3\x08\xBB\x3D\xAC\xCC\xD6\xDF\xA6\xDB\x9F\x1D\x2E\xE2\x3F\x15\xCB\xC3\xD0\xD7\xE5\x58\xE4\xBC\xD3\xD1\xC0\xF7\x1E\x39\xEA\xC6\x86\x00\xFD\xE5\xA1\x0F\xBF\xE5\xE7\x34\xF5\xC1\xCE\xB8\xBB\xE6\xE1\x51\xCE\xCE\x3B\x7F\x05\xD3\xC5\x28\xE9\x98\xE8\x20\x0B\xE6\x58\xD1\x65\xE4\x88\xD0\x6E\xB2\xEC\x10\x7B\x1D\xBE\x86\x02\x40\x20\x5A\xCD\xB8\xE7\xD5\xCD\x02\xF7\x63\xDE\x39\x39\xCD\x03\xE7\xCF\xDC\xAB\x00\xEE\x1F\x6B\xCA\x8D\xC2\x9B\xAC\xE5\xC5\xCC\xF5\xE2\x4C\xD1\x60\xEF\xA9\x0C\x96\xC4\x52\xCE\xCD\x66\x0B\xEE\x47\xFE\x15\xC7\xD0\xD3\xC3\x38\xF0\x3D\x42\xDC\xC3\xE2\x81\x02\xB7\xCB\x64\xE9\x6D\xC5\x99\xDA\xCC\x9E\xDC\xFD\xDB\x9F\xE6\x2F\xE1\xE2\xA5\x81\xD8\xB4\x46\xCD\xE4\xE5\x36\xE7\x3B\xDD\x35\x34\xDE\xCE\xEF\xC3\x08\x3A\x9B\xC4\xE6\x56\xE7\xA7\xE5\x9B\xE1\xD7\x18\x34\xF2\x9A\xCD\x18\x2F\x1F\xDF\xD6\x85\xCC\xA3\xE3\x39\xE6\x7A\x83\x97\xC2\x8D\x8E\xCE\xAD\x3C\x4E\xE7\xCF\x1C\xE2\xC5\x7E\x35\x8E\xD3\x9F\x99\xCE\xBE\xE1\x8E\xCC\xAB\xE1\xFF\xD1\x1F\xFC\x95\xD9\x94\xA5\xCE\xD2\x6E\x59\xE4\x30\xCB\xE5\xCC\xBD\x0C\x35\xD2\xA6\x80\xCF\x28\xC5\xA6\xE5\x8A\xC5\x05\xED\x30\xE8\x08\xF9\x9C\xA5\x13\xF9\x52\x0A\x51\xCF\xCE\x17\xE1\x2F\xC2\x9C\xE9\xBE\xB2\xE6\xB8\x29\xC2\xE4\xB1\x0F\xED\xD0\x31\xE3\x34\x12\xCC\x9C\xCD\xB6\xDB\xAA\xE7\xD3\xC8\x2C\xDF\x92\x13\x3A\xEF\xCB\xD6\xCE\x50\xE6\xB7\xE7\x2E\xD9\xA3\xCE\x75\xC4\x92\x5B\x88\x69\xDC\xD1\xDB\x2C\x46", "\x2A\xD2\xC9\x18\x76\xC3\x49\xD4\x73\x6C\xCE\x70\x1E\xB7\xCE\x6A\xE2\x6E\x92\x38\xE5\x6C\xF5\xCD\xD6\xE5\x47\xE6\xFB\xC7\x80\x62\xDE\xBC\x6A\xDF\x3B\xEA\xC6\x8F\xCF\xAC\xE4\xC2\xCF\x73\xE3\x66\xE9\x3B\xF7\x71\xFE\xCC\xCF\x10\x61\xE7\xC8\xCF\xB4\xE2\xAF\xD6\x36\xE4\x90\xF5\xCC\xA0\xD4\xF3\xCD\xF4\xCE\x2F\xE3\x77\xD9\x26\xF1\x3A\xE1\x9E\x84\xE7\x90\xDE\x93\xDF\xC3\xDD\x57\xDC\x7A\xDE\x85\xEC\xAE\xB0\x0E\x2F\x13\x43\xE4\x17\xD3\xCE\xC6\x7D\xC0\xB6\x2A\xCD\xBB\x1E\xFF\xE0\x50\xE7\x80\xE0\x1F\xEB\x1D\xFA\x87\xF9\x01\x46\xCF\x67\xC5\x01\xD0\x2A\x09\x79\xE6\x10\x09\x87\xE0\xCF\xA7\x02\xAC\xE2\x20\xE6\xAD\xCD\x09\xE2\x1B\xF7\x3E\xFD\xC6\x9A\xCA\xE9\xE6\x78\xE3\x07\xE7\x6E\xED\x3E\xE7\x02\x45\x9F\xBF\x1D\xE6\xCE\xF9\xE7\x3A\xCC\x7E\xE3\x01\xEB\x9E\xCD\xD0\x9F\xE7\x3D\x02\xC9\xE4\x41\x1B\x7B\xE4\x0B\xF0\x7B\x3A\x9F\xAA\xE3\x5F\xD6\x01\xE0\xD4\xD2\x7F\xE0\x6E\xDE\x74\xD0\xD0\xAD\xCE\xB3\x08\x06\xE9\x5C\xDA\x70\xEE\x9D\xD0\x9C\xF0\xCB\xB2\xE6\x7B\xDD\x32\xE7\x68\xD1\x02\xDE\x0B\xEB\x5B\xC2\xC0\xA9\xE3\x95\xE0\x1F\xDA\x0A\xD8\x88\xD8\x24\xFD\x40\xFC\x3C\x1F\xD0\xCE\xDB\x80\x17\x1C\xD9\x5E\xD9\x31\xF9\x40\xF3\xA0\xA8\xD0\xBD\xD5\x15\xD1\x0E\xEA\x35\xE3\x3C\xEA\x96\xFE\xD0\xC0\xD0\x40\xE8\x5A\xE0\x0E\xD3\x88\xE1\x34\xF2\x71\xC4\xCF\xC7\xE8\x3F\xD9\x24\xEB\x71\xE5\x8D\xD1\x7E\xCC\x8E\xF8\xB0\xBB\xE8\xAF\xE4\x15\xDB\x0C\xEA\x8A\xE5\x43\xF2\x42\xC2\x46\x46\xD8\x57\xE8\xAD\xE6\x88\xE2\xCF\xDE\x80\xC1\xA2\xDE\xA1\xA8\xD9\x0D\xD8\x2C\xEB\x5C\xD7\xE8\x17\xBF\xC6\x3A\x27\xCF\xBE\xE3\x68\xD7\x95\xD0\x19\x10\xC4\x90\x47\xE7\x5D\xCA\xC7\x90\xE6\xDD\xD8\xE6\xD0\xF5\xE5\x88\xE6\xB5\xD7\x1A\x09\xC0\xBE\xD9\x80\xE4\x1E\xEA\x67\xE2\x31\xD5\x88\xC6\x8F\xC5\xCA\xA7\x02\x7B\xE8\x13\xEA\x80\xCC\x3D\xEB\xA5\xDD\x8B\xC2\xA9\x89\xE9\xB7\xE7\x01\xEB\xD6\xE5\x13\xE2\x02\xF6\x8F\xC9\xCA\xA6\xD2\x56\xE5\x23\xE2\x20\xEB\x47\xEC\x1F\xF8\x94\xF9\xA6\x90\xE9\x02\xE5\x11\xE7\x24\xEB\x61\xD2\x2D\xA7\x90\xFF\xC9\x9A\xE9\x22\xD7\x4D\x21\x0E\xE4\x4B\xEA\x47\xFE\x92\xF0\xCA\xC6\x1B\x16\xE4\x76\x0F\x29\xEA\x7D\xE7\x9C\xD8\x89\xEE\xC8\x95\xD6\xA9\xCE\x50\xEB\x18\xEA\x92\xEE\x3C\xE9\x4B\x26\xC8\x84\xE3\xE6\xD3\x42\xE1\x20\xE9\x95\xE8\xF4\x05\x8A\xEC\xD2\xDC\x14\xBA\xE8\x0E\xEA\x28\xED\x97\xEB\xB2\xCE\x8A\xE3\xC1\x97\xE9\xBA\xD5\x4C\xE8\x2D\xEB\x48\xD0\xAE\xD7\xA5\xFB\xC0\x8F\xE9\xAE\xE8\x7C\xD3\x90\xE1\x5D\xD7\x59\xC5\x92\xFA\xAA\xB3\xE1\x53\xE9\xFE\xD2\x27\xE8\x9B\xEC\x26\xEC\xA6\xE2\xA4\x80\xE1\xA9\xCA\x68\xE8\x0D\xE3\x9A\xE9\x18\xE8\x7A\x1B\xC9\xEB\xE0\x71\xDB\x64\xEA\x9E\xE3\x29\xE4\x21\xE8\x47\xE1\xC9\xE7\x00\xB3\xE8\x01\xEB\x86\xE2\x2F\xE3\x4E\xF1\xA7\xD9\xD3\x9D\xD2\xC5\xE3\x3E\xE2\x7C\xD3\x30\xE1\x2A\xE5\x8C\xD2\xD3\xFA\xE9\x82\xE5\x52\xE1\x3F\xEB\x3F\xD2\x4F\xE8\x94\xFB\xC9\xF5\xE9\x90\xE2\x58\xE1\xCB\xD6\x9B\xE0\xB0\xC7\x92\xEA\xD0\xC9\xE4\x71\x1F\xCC\xE1\x09\xE9\x55\xED\x4A\xF5\x94\xEF\xB2\xCB\xD4\x63\xE7\xA2\xD7\x27\xED\x05\xE3\x2A\xEE\x84\x12\xCA\x8D\xE5\x0C\xEA\x92\xE9\x32\xE0\x38\xED\x1E\xEE\x5A\xE4\xD3\x9F\xE8\x34\xE7\xFF\xCB\x78\xE0\x2F\xDE\x1C\x5A\x4B\xC8\xD4\x83\xE9\x75\xE9\xA3\x1F\x4A\xD3\xF8\xD6\x10\x1B\x9E\x28\xD4\x9C\xCA\x1C\x16\xFB\x53\xA0\xDA\x77\xEB\x4E\xDE\x73\xEE\xB4\x83\xD7\x44\x1E\x43\xD9\x4D\xCD\x9C\x0C\xA5\x0F\x5E\xD8\xB1\x84\xA9\x5C\x15\x01\x02\x58\xE2\x43\xBE\xAB\x16\x81\x22\xC5\x80\xA5\x8F\x1F\x39\xD9\x9A\xA4\x4B\x1D\x0F\x18\x98\xCF\x87\x39\x00\x5C\x15\x7D\x02\x57\xEC\x05\xAC\xA5\x19\x07\x23\xD5\xB6\x9E\x5C\x15\x7B\x03\x59\xE9\x23\x06\x03\x1C\x52\x35\x03\x6B\xEA\x89\x98\x2E\x17\x3C\x00\xAE\xE4\x03\x1C\x52\x31\x03\x70\xEA\x00\x31\x93\x03\x3B\x00\xAE\xE2\x03\x1C\x52\x2D\x03\x70\xEA\xF4\xD9\x51\xD8\x3F\xDE\x84\x99\x3A\xF0\x68\xC0\xB4\xED\x1F\x3C\x02\x4B\xDB\x1B\x02\x4D\x48\xC9\xC1\x67\xEB\xA4\x9B\xD9\x4B\xEB\xD4\xCE\x53\xEE\x8C\xD0\x55\xF9\x40\x13\xD5\xF2\xA5\x31\x64\x90\xE7\x55\xEF\x54\xA6\x2D\xB9\xAA\xE1\x94\xDB\xEA\x27\x03\xAE\xE8\x62\xD8\xAC\xE7\x12\x02\xAB\xC8\xB6\xB8\x00\x65\xEA\xB8\xEB\x0D\x01\xAD\xE0\x57\xED\xAB\xE7\x04\x6F\xEA\x88\xDB\x1A\x02\x5C\xEC\xAE\xE6\x57\xF8\xAB\xDC\x29\x7B\xEA\x88\xDB\xBE\xEB\x49\x07\xAF\xE8\xD8\xC1\xAC\xC7\x3D\x24\xD9\x84\xEB\x17\xDE\xEA\xE0\x8D\xEF\x56\xC9\xAC\xFF\x3A\x2B\xD9\x97\x5C\x68\xDA\x4E\xED\x1C\xE7", "\x4C\xD1\xAC\xE6\x97\x93\xEB\xD2\xDE\xAF\xE7\x94\xE4\xE9\x17\x59\xF6\x50\x71\x93\x41\x20\x9B\xEB\x5E\xA7\xBE\xA6\xB3\xE0\x52\xC0\xAD\xC9\x04\x22\xEB\xB4\xE2\x9E\xA1\x58\xE8\xAE\xE8\x5A\xE7\x09\x26\xD5\x88\xDB\xAB\xEB\x93\x02\x5A\xE8\xB1\xDE\x5A\xE9\x08\x30\xD6\xE1\xEB\x7D\x99\xD9\xE8\x62\xDD\xAE\xE7\x12\x17\xAB\xC8\xB6\xF9\xEA\x09\x02\xDC\xE8\x7C\xE8\x43\x7E\x57\xE0\xAC\xDE\xB7\x90\xE7\xF1\xD8\x5E\xDB\x13\x13\x3A\xEF\xCB\xC4\x71\xE3\xB9\xA6\xDC\xBC\x30\x62\xD8\xD2\x1E\x98\xDE\x5C\xF9\x4D\xD0\xD7\xF2\xDF\xD2\xEB\xA8\xE9\x75\xE8\x04\x77\x5D\xE0\xE3\x1D\xD7\x9C\xEB\x6F\x42\xEE\xEB\x47\xCE\xBB\xE6\x10\x00\xAF\xC9\xCB\xE2\xEB\xA5\xEA\xF2\xE9\x6A\xE8\xBD\xEC\x5A\xEC\xAF\xEE\xD5\xF0\xEA\xB2\xEB\x93\x03\x5C\xEB\xBE\xE5\x5B\xF7\xAF\xF7\xD6\xFC\xEA\xFD\xEB\xDE\xEB\x7F\xE9\x92\xE2\x76\xD5\x7E\xEE\x18\x53\xD9\x49\x33\x07\xDF\xFC\xD2\xC1\xD5\xE6\xD0\x7D\xE6\x93\x35\xCA\xA3\x0D\xA6\xE9\x4D\xCB\xEE\x52\x61\xE1\x29\xD4\xD5\xC3\x03\x5C\x14\x0B\xEF\x86\xE8\xC3\xE1\x03\x1A\xB0\xDE\x94\x9C\xEC\x03\x02\x0F\xED\x7D\xDF\x7E\x44\x5A\xE9\x08\x26\xD6\xFB\xEB\xE5\xEB\x84\x03\x79\xEB\xBF\xE9\x5E\xE9\x08\x2B\xD7\xFB\xEB\xED\xEA\x83\x03\x7B\xEF\xC3\xE1\x5F\xEA\xB1\xF4\xD6\xF5\xEB\xB6\xEA\xBD\xE8\x8C\xEB\xB7\xEE\x5F\xF1\x71\xEA\xC3\xC5\xDB\xA2\xE4\x47\x20\x30\x22\xB2\xDF\x51\xC1\xB2\xE7\x04\x0F\xEC\x34\xEB\xF6\xD9\x2B\xDE\xB2\xE6\x64\xF8\xAC\xD5\x1A\x49\xEC\xD9\xEA\x69\xA4\xC1\xA6\xC9\xED\x51\xD0\xB2\xC2\x04\x52\xEC\x4E\xE9\x9A\xA3\x78\xEF\xB4\xE3\x62\xFC\xB2\xE5\xD8\xE0\xEC\x27\xED\xD8\xEA\x7C\xEB\xBF\xE4\x5F\xE9\x08\x36\xD7\xFB\xEB\xF8\xEA\x83\x02\x7E\xEC\xCC\xEC\x5F\xEC\xB3\xF2\xD8\xEE\xEC\x45\xE9\xF4\xD7\xEA\xDF\xCA\xDB\xF9\xDF\x28\xF4\x2E\x6B\x61\x3A\xEC\x73\xE6\x8F\xDA\x65\x39\x1C\xF6\x28\xFE\xD6\xFD\x16\x0D\xEC\x21\xD4\x9E\xEB\x4C\xD5\x59\xFC\x7B\x13\xD8\xA1\x81\x15\xED\x40\xEE\x97\xCB\xD0\xE4\x48\xF7\xB0\xDA\xD7\xF7\xA3\x5C\xEA\xB8\xE9\x95\xEE\x20\x07\x65\xFC\xB4\xD9\xD9\x86\x02\x5B\xEC\x4E\xED\x97\xEE\x20\x0F\x65\xFC\xB4\xE1\xD9\x83\x02\x63\xED\x29\xED\x84\x9B\xD2\xEC\x69\xF5\xB4\xC6\x04\x17\xED\x9C\xED\x4C\xEF\x40\x03\xD3\xE2\x6D\xFB\x1B\xB1\xD8\xFB\xEB\xAF\xED\x9F\x1C\x70\xEF\x91\x95\x58\xF3\x64\xC8\xD6\xF0\x00\x02\xDA\x88\x04\x41\xDC\xE8\x16\xD0\xC0\x31\x21\x94\xF1\x0C\x42\xEC\xF6\xD9\x1D\xDC\x22\x05\x64\xE0\x29\xC7\xD9\xCA\x02\x80\xED\xCF\xE8\x93\xEC\xD0\xEC\x51\xC6\xB4\xC1\x04\x08\xED\x6F\xED\x01\xAB\xB0\xEB\x20\x05\x6C\xFD\xB6\xE4\x40\x8D\xED\xCA\xED\x47\xEE\xB3\xE9\xD2\xEB\x5F\xE9\xB1\xC9\x04\x2B\xEC\x94\xED\x16\xEC\xA6\xEF\xC5\xE9\x5B\xFF\xB6\xDC\xDA\xCD\xEC\xA0\xEC\x00\xEF\x54\xDC\xC6\xEE\xAF\x02\x57\x14\xB4\xE2\x02\x1F\xDD\xA3\x1F\x56\xDA\x19\x39\x6A\xFB\x61\xFC\xD8\xA7\xDC\x3C\x1F\x8F\xDA\x56\x19\xA4\xCC\x54\xF7\xB3\xC3\xD9\xB5\xED\xF5\x15\x5B\xEF\xEC\xC1\xD7\xEA\x6F\xFF\xB5\xD9\xD8\xBD\xED\x4B\xEC\x9B\xEE\x7E\xDF\xDF\xE2\x6C\xEB\xB4\xD8\xD9\x88\xEE\x06\xEF\x97\x9E\xC2\xE9\xE8\xEB\xE1\x8C\xB8\xDC\xDA\x8E\xEE\x06\x02\x88\xED\xB5\xEA\xE2\xE9\x6D\xF4\xB8\xFB\xD7\xBA\xEB\x09\x02\xDE\xE8\xB8\xEB\xC6\xE1\x4A\xE0\x6F\xEA\xB4\xDA\xB7\x2C\xDB\x92\xEC\x1D\xDF\xE4\xEC\x8B\x32\x69\xE4\xDA\x98\xDE\x92\xEB\x97\xED\x84\xEC\xCF\xE6\x6F\xFE\xB3\xE3\x36\x56\xEA\x35\xEE\x41\xEF\x88\x70\xE3\xE4\xF4\x1A\xAA\xD8\xD8\xBB\xEE\x00\x00\x80\xED\xA8\xED\x37\xAE\x73\xE6\xB6\xC0\xDD\x89\xED\x68\xEA\xF5\xE9\x6B\xEE\xE8\xE4\x74\xE8\xBA\xC3\x04\x4A\xEE\x44\xEE\x6B\xEF\x40\x00\xDB\xE4\x74\xFA\xB6\xC2\x04\x5C\xED\x78\xEE\x1B\x76\xC5\xEC\xE8\xEC\x76\xF9\x70\xE0\xB6\xBD\xDA\x5A\xD0\x8F\xEC\xD0\xC2\x31\x21\x72\xE3\x7A\x23\xDC\xEA\x31\x06\xED\x1D\xEF\xAA\xE9\x5C\x3B\x92\xCB\x6A\xF4\xB4\xEA\xDD\xCF\xEA\xB1\xEE\x9E\xED\xB1\xE6\x6B\xFD\xB3\xD6\xD7\x99\xEB\x8C\x1E\x5D\xEE\xAC\xCC\xD7\xED\x76\xE9\xBB\xFB\xDA\xED\xA3\xC1\xED\xD1\xE9\xDD\xEC\xE8\xE7\x6C\xE3\x08\x09\xDB\xC4\xEE\xCB\xED\x81\x01\xB3\xEC\xE8\xEF\x6C\xE2\x08\x11\xDB\x89\xEF\x71\xEA\x33\xEC\x8B\xE8\xCD\xEE\x62\xEA\xB3\xD5\xDC\x9E\xED\x53\xEF\x8C\xEC\xC7\xE9\xBF\xD0\x79\xF5\x71\xE2\x2B\x57\xDA\x07\x3B\xCA\xEF\xCF\x1F\xF2\xED\xAD\x6A\x63\xD3\xB9\xC9\xDA\x3C\x1F\xB0\xDA\x74\xB0\xC8\xE1\x76\xF2\xB7\xDC\xDD\xA4\xEF\x31\xEE\xD3\xEC\x85\xE8\xF5\xE7\xF9\x0A\xBD\xDC\x9B\xD3\xA5\x8D\xEE\x05\xED\xA1\xEF\xED\xE1\x7B\xFB\xAF\xC3", "\xDC\x82\x02\x05\xEE\xE0\xED\xED\xEA\x20\x07\x7B\xE0\xBE\xF9\xDE\x82\x02\xBB\xEE\xE0\xED\xEF\xE9\x20\x0F\x7B\xE1\xB8\xF7\x8F\x7E\xEE\x02\x02\xC0\xEC\xF0\xEA\xF0\xE2\x10\x04\xBC\xC0\xDF\x86\xEF\x01\x02\xC4\xEE\xFF\xEB\x6E\x8B\x78\xE0\xBE\xE9\xDF\xF2\xDC\xA0\xDB\x38\xED\xDC\x1E\xAD\xD3\x10\x1D\x6D\xDE\x94\xF6\xEC\xFC\x2C\xD1\xEF\xBC\xEB\xBA\xE9\xF5\x12\xB9\xE4\x45\x66\x35\xF9\xEC\x5F\xEE\xDA\xEB\xBB\xE8\x73\xEF\xB2\xEC\xDF\xA1\xEB\x3D\xEF\x10\xEC\xA3\xEE\xBC\xEA\x5A\xE3\xBA\xFA\xDF\xFC\xEE\xC0\xEE\x00\xF1\x40\x02\x00\xFB\x80\xFA\x45\x8C\xDD\x85\xEF\x4E\xEE\x4E\xEC\xD4\xEE\x20\x02\x75\xF7\xB8\xD4\xDD\xBB\xE9\x62\xCF\xBB\xD9\x5E\xD8\x5A\x7C\x7D\xE1\xBD\xDE\xDF\x9B\xEF\xA0\x31\x7A\xEF\x47\xCF\xDE\xE0\x12\x01\xC1\xF9\xDC\xA3\xF0\x9D\xEB\x12\xF3\xFA\xEA\xE7\xED\x7E\xFC\xB4\xEF\xDF\x81\x02\xF1\xEF\x1A\xF3\xC1\xEC\x05\xF4\x62\xFA\xBB\xE6\xD8\xAF\xEB\x28\xEC\x6A\xED\xE0\xEF\x06\xF7\x80\xF9\xC1\xC4\xDD\xBB\xF0\x03\x03\x1E\xF0\xE3\xEF\x07\xFA\x4C\xEF\x6D\xC3\xB6\xDD\x42\xB1\xED\xB8\xDB\xAC\xEA\x1A\xE0\x73\xE6\x65\x1E\xE0\xB9\xC7\x20\xF0\xB4\xEE\x08\xF7\xF5\xE4\x82\xED\xBD\xFB\xE1\xAB\xEF\xB0\xEE\x14\xF2\xEC\xEA\x05\xFF\x73\xFC\xC2\xCE\xDA\xDE\xF0\x90\xEC\x30\xF2\xA4\xEA\xF8\xE1\x71\xE4\xBE\xD3\xDC\xC6\xEF\x4F\xEF\x06\xF2\x16\xF3\xD8\x5C\x86\xF3\xA7\xF4\xB9\xEB\xDB\x10\xD9\x9B\xE4\x79\xE3\x13\x24\x67\xFB\x9C\xD9\xE2\xC6\xF0\x9F\xF1\xD1\xEC\xBD\xEC\xEC\xEB\x84\xE6\xBB\xD4\x11\x4E\xF0\x26\xF0\x9B\xEF\x03\xF3\x13\xF9\x8A\xF0\xC2\xE2\x5D\x55\xF0\x44\xEF\x2B\xF0\x00\x01\x0B\xF3\x77\xF0\x03\x33\xDF\x81\x02\xF5\xEF\x49\xF0\x1C\x07\xFE\xE1\x10\x19\xBF\xFA\xE2\xFB\xEF\x00\x01\xFE\xED\x2D\xF2\x06\xF0\x00\x14\xC1\xF5\xE2\x84\xF0\x01\x02\x03\xF2\x2E\xF0\x01\xF0\x00\x0A\xC0\xF5\xE2\xE8\xF0\x02\x02\x35\xF2\x03\xF7\xB2\xD9\x10\x06\x6D\xDF\x94\xAD\xEE\x19\xF1\x23\xF1\xCF\xE2\x65\x3A\x84\xFE\x28\xCC\xE1\xF6\x3D\x7A\xF1\x27\xF0\x1F\xF1\x0A\xFE\x87\xE2\xC7\xC0\xE2\xDA\xA3\xB0\xF0\xE0\xEE\x2C\xF4\x16\xFA\x71\xF6\xC5\xF7\xDD\xBA\xF1\xBC\xF0\x00\x02\x2F\xF5\x16\xF0\x8C\xE2\xC6\xED\xE3\xC4\xF1\xC6\xF1\x76\xF0\x32\xF0\x00\x0A\x8C\xF5\xC5\xCC\xE3\xCE\xF1\xED\xF0\x68\xF1\x40\x02\x1A\xFA\x8B\xEB\xC5\xC0\x00\x5D\xDC\xB5\xF0\xB8\xEC\x72\xD9\xCF\xEB\x81\xEB\x49\xD6\xE3\xE3\xC2\x61\xD7\xEE\xED\x28\xF3\x03\xFD\x8D\xFD\x28\xDF\xE3\xA8\xF1\x53\xF0\x57\xF2\x41\xF0\x17\xDA\x51\xDE\xB7\xF1\xDD\xA9\xF0\x56\xEC\x11\xEE\x21\xF1\xE1\xE8\x88\xEB\xB8\xCA\xE2\x8D\xEE\x62\xF1\x01\xF0\x19\xF3\x19\xF6\x86\xE0\xBE\xC2\xE4\x80\x00\x04\xF3\x5A\xF2\x41\xF0\x21\xFD\x8E\xF0\x6D\xFC\x3C\x32\xDB\x06\x03\xEB\xD9\x9D\xEA\x22\xFD\xC2\xD5\xC3\xD4\xD7\xE2\xEF\xB8\xEC\xF2\xEC\x0B\x26\xFC\xE1\x31\xEB\xBB\xFC\xDB\x9B\xCA\x1E\xF2\xB9\xED\x3B\xF3\x1D\xF2\x92\xFA\xB2\xED\xE0\xA5\xF2\xBC\xEE\x18\xF2\x2E\xF0\x1F\xF7\x66\xF6\xB4\xE9\xD9\xF9\xEB\x6B\xED\xA8\xED\x9B\xEF\xBE\xD4\x74\xF6\xC9\xC4\x3D\x16\xF0\x01\x03\xDF\xDA\x47\xC8\x1B\xFE\xBC\xDA\xC0\xDF\xDF\xA3\xF1\xA5\xEF\xB2\xEF\xE9\xEF\xCF\xE1\x8E\xED\xC5\xE3\xE3\xB7\xEE\xE5\xF0\xB7\xF3\x39\xF0\xD8\xE2\x88\xEE\xBF\xF3\xDE\xF2\xEF\xEF\xF1\x5A\xF1\x3C\xF3\x1E\xFD\x8E\xF5\xC7\xE1\xE1\x8C\xF1\x4B\xEE\x47\xF1\xD3\xE8\x12\xFA\x83\xF2\xC4\xF2\xE4\x95\xF1\x0E\xEB\xAD\xCD\x9D\xDA\x1B\xF1\xE1\xCC\xB5\xD2\xE0\xFF\x01\xCC\xDB\xAF\x97\x05\xF4\x27\xFF\x54\xE3\xBB\xE9\xE5\xA5\xF1\x6B\xF3\xB3\xEC\xDB\x1C\x28\xF6\x39\xE6\xCA\xD2\xE1\xFD\xED\x27\xF1\xEF\xE8\x48\xF4\xD8\xED\x94\xE8\xB6\xCF\xE5\xDE\xEC\x7B\xEF\x93\xF3\xD1\xE9\x25\xFA\x8B\xFB\xC7\xFD\xE3\xED\xF1\xFF\xF1\xAC\xF0\x0F\xF3\x2B\xFE\x78\xFB\xAF\xDE\xE5\x9B\x21\x3A\xF2\xEB\x5D\x44\xF0\x14\xFD\x93\xF6\xCC\xE1\xDF\xEA\xF2\xE3\xEE\xB6\xF3\x66\xF6\xF5\xE3\x97\xF0\xCB\xCA\xCA\xE6\xF1\xE7\xEF\xFF\xA1\x3A\xF2\x17\xFC\x94\xEB\xC1\xCE\xE5\xDD\xF0\xA8\xF3\x2F\xF2\x7B\xEF\x2F\xFF\x70\xF5\xCA\xD7\xDB\xD7\xF2\x9A\xEC\xD9\xF1\x1A\xF4\x36\xF6\xE4\xD1\xC0\xF4\xA1\xE2\xDB\x27\x02\x2B\x6B\x35\xF4\x32\xF4\x59\xFE\xCD\xF6\xE1\xC0\xF2\x33\xEE\xA1\xF0\x76\xEC\x38\xF9\x9C\xFE\xCC\xF1\xE5\x99\xF2\x6F\xF2\xB8\xEE\x52\xF3\xF9\xEA\x68\xE4\xC4\xF6\xDD\xA3\xF2\xB8\xEE\x17\xF3\x2F\xF2\x2A\xF3\x8C\xEC\xCD\xC7\xE3\xAB\xF2\xFE\xF1\x96\xF2\x2E\xF7\x25\xF1\x93\xED\xC7\xF3\xE4\xF0\xEA\x0A\xF2\x3B\xDE\x28\xF7\x29\xD8\xF9\xC7\x09\x32\xB7\xAC\xEE\xE4", "\xF3\xE8\xEB\x82\xF5\x22\xFC\x51\xD7\xC8\xED\xE5\xF0\xF3\xC5\xF3\x8D\xF2\xDB\xEC\x0A\xF5\x97\xF6\xC2\xF7\xE5\xBA\xF1\xB7\xF0\x00\x01\x2E\xF2\x2F\xFA\x9F\xF4\xC7\xFC\xE7\xF7\xF1\xFE\xF2\x7D\xF0\x80\xF0\x36\xF2\xA0\xEF\xC6\xC6\xE6\x86\xF4\x88\xF3\xC2\xEB\x62\xF3\x22\xF7\x96\xF6\x84\xD9\xA9\xDF\xEE\x08\xE0\x39\xF2\x59\xF0\x09\xF7\x89\x34\xD0\xDB\x94\x96\xF4\xC3\xF3\x3F\xF1\x7B\xF5\x0F\xF7\x9C\xF2\xCB\xC3\xE9\xF4\xF2\xA2\xF3\x41\xF1\x48\xF6\x39\xF6\x9A\xF0\xCE\xCC\xDB\xA9\xF3\xD3\xF3\x45\xF1\x75\xF3\xF8\xE6\x95\xE5\xBE\xD8\xE5\xC7\xEF\x5A\xF3\x4F\xEC\x57\xF0\xF8\xE0\x03\x11\xA9\xE6\xAA\xBC\xE6\x8D\xF3\x05\xDD\x46\xCD\xC1\xD9\xB5\xDA\x83\x47\xD5\xAA\xED\xDB\xF0\xCE\xEF\x84\xD8\x47\xFC\x0E\xFC\xCD\xD5\xE6\x93\xF4\xA4\xF0\x6F\xF2\x29\xF5\xAA\xE1\xA4\xE8\xCE\xC5\xE5\xC4\xF4\xEA\xEE\xD0\xF0\x87\xF1\x49\xF6\x97\xF6\xCF\xF4\xDE\xF9\xF2\xED\xF1\xBD\xF0\x94\xF2\xCC\xE4\x9D\xE9\xBA\xD6\xE7\x83\xEF\xD8\xF3\x6D\xEE\x76\xF1\x1A\xFC\x9D\xF0\xC0\xF6\xE6\xDE\xF4\x50\x0E\x30\xF4\x99\xDE\xBD\xDD\x75\xDF\x2B\x0F\xC2\x23\xDC\xD6\xD8\xCD\xED\x9A\xF3\x7F\xD8\xE2\xCC\xD3\xD1\xC7\x8E\xEC\x3B\xF5\x4D\xF5\x8F\xF1\x4E\xF6\x91\xF3\xD3\xC8\xD9\x97\xF4\x7A\xF4\x8D\xF3\x51\xF5\x23\xF1\x9A\xFD\xB0\xE3\xE6\x84\xEE\xA5\xF2\xDB\xEF\x69\xF7\x49\xF2\x9D\xE4\xD4\xD2\xE9\x86\xF5\x54\xF5\xEB\xF2\x95\xF1\x3B\xF8\xA5\xF3\xCD\xDA\xE9\xB5\xF3\x9C\xED\x2E\xF4\x0A\xED\x8C\xE7\x7D\xE0\xDF\x1B\x94\xBA\xDC\x67\x60\xD4\xE6\xF1\xE6\xDC\xC6\x51\xC1\x72\xF5\xBA\x91\xF4\x10\xEC\x38\xF7\x65\xF2\x4E\xF9\x99\xE7\xC5\xE8\xEA\xC8\xF2\xFB\xED\xCF\xF0\xB6\xF3\x4F\xFE\xAA\xEA\xD2\xE4\xE6\xCC\xF4\xB2\xF4\x27\xF6\xEE\xEB\x50\xF0\x6D\xE5\xD4\xFF\xDD\x87\xF5\x05\xF1\x44\xF7\xE1\xEB\x51\xF3\x90\xED\xD4\xC1\x04\x34\xF2\xF4\xF2\x5B\x38\x98\xDA\xA2\xD4\xAC\xE7\xB0\xCD\xB9\xC3\xDA\x4F\xDD\x5D\x17\x17\x62\x71\xCB\xAC\xEA\xD3\xFC\x3C\x56\xDC\x2A\xDD\x77\xEC\xB4\xF4\x21\xF5\xA3\xFE\xD1\xE4\x9C\xA6\xF5\xF8\xED\x6B\xF4\xAB\xF2\x15\xFB\xAA\xF9\x28\xC9\xE5\xAF\xF5\xF0\xEF\x58\xF4\xFD\xEB\x56\xF3\xAE\xF5\xD5\xE5\xEB\xB7\xF5\xE7\xF5\x5C\xF4\xA2\xF3\x57\xFA\xA8\xFD\xD5\xDB\xE7\xBF\xF5\xDD\xF3\x47\xF7\xB0\xF6\x33\x12\xA9\xE8\xB0\xD5\x63\x39\xF4\xB8\xA8\xE7\x3E\xD6\xEB\xCD\xD4\xF4\x0D\x73\xEC\x29\x35\xCA\x43\x0B\x78\xEC\x8D\xF4\x47\xFB\x67\xF3\xD6\xE5\xEA\xD5\xF5\x74\xF4\xCD\xE8\x7B\xF7\x4E\xF4\x8E\xE5\xD2\xD8\xE8\xC7\xF4\xAF\xF1\x0E\xF5\x2C\xF7\x43\xF5\x8B\xE1\xD1\xE3\xE8\x81\xF5\x25\xF5\xBE\xF3\x89\xF1\x5E\xF5\x66\xF3\xD2\xCD\xE2\xD5\xF4\x8F\xF1\x2B\xF5\x24\xF0\xF9\xEE\x83\xEA\xBE\xD5\xDD\xDD\xDB\x98\xF1\xDE\xF3\x82\xF3\x5E\xF5\xD5\xD5\xD7\xFC\xB9\xFC\xDC\x46\xEA\xEB\xEF\xB2\xD9\x3C\x1E\x44\x43\xAA\xF9\x9D\x9E\x64\x7B\xCF\xEA\xEC\xBF\xF3\xF7\xD9\x0D\xFE\xD4\xDA\xCE\x9D\xCA\xD9\x16\x7C\x60\xBD\x3B\x65\xFA\x89\xEB\x49\xD3\x98\x83\x02\x39\x1E\x0D\xD9\x6E\xD2\x94\xDF\xA6\xF4\xC8\xCE\xBA\xE2\xE2\xEE\xB9\xCD\x67\x1B\xCF\xAE\xD1\xFD\xCC\x5A\xCB\xE0\x83\x02\x7C\xF7\xF2\xF2\xB4\xF6\x20\x03\x05\x00\xDC\xFB\x73\xFC\xC2\x32\x04\x2E\x17\x03\x21\xA4\xCA\x4C\xC5\xE5\xA1\x72\x91\x02\x5A\xE3\xD5\x0E\xA6\x09\x96\xE1\x1B\x08\x0C\xEA\xA2\xF8\x11\x76\x82\x25\x14\xF7\xC6\x6E\x78\x18\xDF\x07\x11\xBF\x94\xDC\xEE\xE2\x21\xD5\xE2\xF2\x42\xFE\xB7\xE9\x08\x0D\xEE\xA1\xCA\x81\xF7\x78\x11\x78\xF2\x2C\xE5\xB9\xF8\x03\x85\x73\xF5\xCB\xCA\xDF\x21\xF0\xE3\x4B\xC5\xD9\x7A\xCB\xDD\xD1\xEB\xAD\xF7\x8C\xF6\xC7\xF5\x51\xEB\x73\x72\xB9\xF4\xDD\xD2\x93\xA4\xB9\xB6\xF6\x53\xBB\xE7\xF3\x96\x01\xBA\xE1\x21\x04\x8F\xF6\x76\x11\xDF\x1D\x07\x1B\xF6\x20\x0B\xF8\xD7\x8A\xFB\xA7\xBE\xF7\x04\xF6\x9A\xF4\xF8\xEB\x20\x0F\xBA\xE1\x5D\xCF\xEE\x81\x97\x98\x17\xE2\xF4\xE5\xF7\x78\xFD\xC8\xA9\xDE\xD7\xEE\x8A\x64\xD4\xF0\x83\x03\x43\xF2\x4D\xEA\xBA\xE1\xD5\xE1\xE9\xC9\xF0\x7F\xF6\xD8\xF7\xF7\xF7\x9D\xB1\xBE\xEE\xD0\xC6\xEF\xED\x2D\xF2\xB8\xC8\xF5\x30\xBC\xB2\x16\xA8\xC8\x7A\x19\xB7\xE9\x53\xC7\xE9\x93\x00\xF6\xF4\xD6\xE6\x9E\xE0\x24\x02\xEF\xFD\xDC\xC4\xF7\xD9\xF7\xF8\xF0\x7F\xF3\xC9\xB6\xDC\xD4\x2E\x80\x15\x25\xEB\xB8\x1E\x78\xF4\xF4\x40\x4F\xF7\xDE\xEE\xEF\x93\xF5\x35\xF7\xE0\xF6\xFC\xF3\x78\xF8\xCF\xA2\xDF\xE0\x94\xB5\xF7\x7E\x81\xF3\xF7\x72\xEC\xE7\x1A\xF9\xD2\x74\x2F\xB9\x82\x02\x03\xF8\x3A\xF1\x01\xF9\x8D\x07\xC0\xE0\xDB\xC9\xF0\xD5\x68\xF7\xF6\x83\x02\xB5", "\x8E\x81\xF5\x6E\x94\x6C\x19\xEE\xA1\x12\x27\x20\xF0\x02\xE7\xF2\xA3\xC0\xBA\xE6\x5A\x49\x1F\x1D\xC3\x1F\x09\xD2\xF6\x45\xCC\xF4\xD9\xE2\xD6\xDE\xCC\xA7\xA9\xF8\xB9\xE2\x9F\xF0\x0B\xFB\x83\xF8\xC0\xFD\xE0\xCA\xF0\x9F\xF8\xE4\xF6\x50\xBB\x03\xFE\x4E\x16\x51\xD7\x91\xBA\xE2\x01\xF8\x68\xC9\x0B\xFA\xC9\xF0\x2D\xFA\xC1\xFE\xDE\xDC\xF0\xFA\xF7\x4D\xF1\x27\xFB\x47\xC8\x84\xF4\x08\x87\xDF\xEB\xA4\xF1\xC5\x00\xF6\x23\xF8\x97\x10\x89\xFD\x29\xEA\xE2\xE9\x12\x2D\xF8\x68\xF6\x76\xC8\x18\xF8\x1C\xF0\xC3\xEB\xE0\xF2\xF0\xDB\x8D\x34\xF8\xB5\x94\x65\x1F\xAE\xDB\xEC\x6E\xCB\x6E\xD4\xF1\xDA\x6C\xF9\x9F\x1C\x91\xE9\x7E\xFE\xC5\xED\xE2\xF3\xF1\x9E\xF8\x63\xF9\x28\xFB\x32\xC9\x9F\x3F\x0F\x0B\xF6\x77\x01\x58\xF8\x06\x03\x40\xFB\xCE\x1B\x90\xFE\xBA\xF0\xE3\xCF\x1A\x79\xF7\xE0\xF6\xBB\x14\x97\x15\x09\x01\xC3\xF2\xBD\x18\xF2\xF4\xF7\x53\xF8\xD1\x06\x45\xCE\x4D\xA3\xDE\xC9\xDD\xC0\xF2\xDA\xF8\x6C\xD8\x2E\x15\xF7\xF6\xD4\xE3\xBF\xE2\xDC\xF5\xEF\xF5\xF8\x50\xF8\x06\xF8\xF2\xF1\x84\xF1\xCA\xEB\x49\xE8\x88\x81\x9D\xCE\xDF\xDE\xF4\x2A\xFF\x8A\x3A\xCA\xF6\xE4\xF6\x1E\x1F\xF9\xAE\xF8\xBB\x17\x0D\xFA\xD3\x0A\x76\xD4\x99\x2B\x8A\xEB\x11\x3F\xF4\x3B\x20\x53\x18\xE2\xD3\x4E\xC4\x16\xEB\xA4\xC4\x95\xB8\xF9\x21\xDE\x00\xFB\x97\xF3\x8F\x3D\xE5\xCC\xF1\xAE\xF8\xF8\xB9\x61\xF9\x5E\x03\x25\x17\x2C\xC1\x16\xF6\x1F\x47\xF9\x5B\x07\x64\xFB\x57\x16\x9C\xCB\xB7\xC1\x90\x36\xE2\x2E\xC5\x8F\xF2\x04\x85\x13\x8E\x94\xF6\xC1\xEC\xCC\xD8\xF0\xDB\xF7\x06\xF9\x6B\xF9\x1C\xFC\x98\xB4\x2A\x82\xE3\xDE\x94\xE4\xF8\x8A\x81\xD4\xD4\xCF\x18\xFF\x6E\xB2\xFF\xE3\xED\xF3\xB3\xF6\xA2\xF5\x0C\xF8\xF7\xF6\x97\xFE\x2C\x14\xE7\xEF\xF2\x86\x02\x93\xF7\x58\xFB\x1D\xFD\x81\xF6\xBE\xE1\xE5\xEC\xA9\x96\xCA\x12\x8B\x5A\xB1\x4E\xEB\xFF\xD3\x10\xE0\x00\x39\x01\x13\xFA\x76\xE8\x88\xFA\xE0\x53\x52\xE0\x76\xE9\x4A\x00\xC5\x06\xDD\x9A\xF5\xF7\xF4\xA5\xF0\xA3\xF8\x5E\xCC\xAE\xC1\x04\x7B\x00\x1C\xFB\x7D\xD8\x40\x15\x2F\x49\xA9\xE8\xD3\xE2\xF4\x89\xEC\x24\xFB\xBF\xDD\xE7\xD7\x24\x0C\x07\x0E\x6E\xE6\xDB\xC5\xEB\x70\x00\xA8\x17\xE6\xA0\xC3\x02\x7D\xFB\x79\x2B\x26\x6A\x9D\x79\xDF\x90\xFB\x3B\xFC\x22\x01\xD3\xE9\x5C\xEE\xDA\xF1\x30\xE1\xDA\x8B\xC9\x11\xDA\x20\x0D\x07\x0E\x6E\xF8\xCC\x98\x1B\x6A\x08\x92\x58\x8F\xDD\x5F\xF0\x8A\x39\xDC\xC0\x6C\x2F\x1F\xAD\x03\x9E\xF9\x51\xFF\x33\xE8\xF4\x0F\x63\xC6\x04\x57\xE6\x22\xEB\xF1\xF0\x40\x13\x2E\x64\xB7\xF2\xAE\xDB\xF5\x8E\xCC\xCA\xDE\xEF\xD4\x28\x5E\xA9\xF5\xA9\xF1\x77\x23\xE7\x4A\xF5\xC5\xF4\x58\x42\x55\xFD\x8D\x0D\xBF\x18\x6C\x66\x5F\x7D\xDB\x6A\xFB\x80\x01\x20\x07\xAC\xFA\xB9\xCB\x49\xDA\xAF\x81\x02\x43\xE6\x30\xEB\x47\xCD\x74\xE7\x2B\x08\xCF\x65\xEC\xEC\xD8\xAB\xE7\x5F\x1C\xA6\x42\xF5\x03\x1B\x7A\xEA\xFC\xF5\xDD\xD6\x16\xCB\xBF\xF8\x00\x03\x10\x0F\xD8\xF5\xEC\xD0\xF6\xDA\xF5\x84\x00\x0C\xE3\xE3\x18\xEE\x16\x08\x1E\x85\xC4\xE4\x82\xE7\x05\xF4\xA6\xF5\x96\x46\x83\xE7\x71\xEC\x35\xC7\x02\x3E\xE1\xFF\xC3\xFF\xD3\x4B\x11\xB5\xFD\x95\xE1\x61\xD2\x4B\x8F\x43\xA9\xE7\x18\x00\xAB\xCD\x10\x0E\x0B\xE5\x05\x82\xCE\xA5\x81\x09\xF2\x93\xE4\x1A\x27\xD3\x35\x58\xF3\xED\xFE\xC2\xF6\xD9\xC0\xD4\xC8\xE8\x68\xDA\x86\xE5\xC5\xD2\x74\x22\x94\x3D\xFB\x70\x1E\xDA\xF8\x47\xEA\xA2\x82\x38\xEE\x71\xD1\xB2\xC0\x39\xBA\xFA\x27\x68\x6F\xFA\xB8\xE2\xC9\xF6\xEC\xFE\xEC\x8E\x21\x4A\xEA\x08\xF6\x79\xCD\x13\xFA\xB8\xE0\xDE\xE7\xE7\xC0\xF3\x41\xF2\xE1\xF2\xCE\xF2\x48\xFC\xB3\xE6\xCE\xF9\xE9\xDB\xF5\xAE\xF0\xF9\xF0\xC4\xF0\x0B\xF2\xB1\xF8\xC5\xD4\xEC\xF8\xEF\xE4\xF4\xDF\xEE\xB9\xF1\x00\xF8\xAE\xE9\xC6\xEA\xEB\x89\xF0\xEC\xF4\x98\xF0\x60\xEA\xA5\xF9\xC8\x0F\x64\xE2\xED\xBA\xE4\xFF\xD8\xA1\xC5\x2A\xDF\xD7\x17\xC9\xDC\xE2\xDB\x9D\x8F\xEB\xDF\xC9\x38\xF3\x7E\xD4\xBB\xFC\xBA\xE5\xD8\xE4\xEA\x95\xF4\x08\xF7\x30\xF9\x9D\xF6\x48\xF5\xDE\xFA\xD0\xFB\xEC\x9D\xF3\xE8\xF0\xA1\xF6\x3A\xF4\x68\xFD\x8E\xE6\xDA\xEF\xF7\xBD\xF1\xF1\xFA\xFE\xEF\x7C\xFB\x06\xF5\xDF\xFC\xC7\xF7\xF7\xCD\xF1\xF9\xFB\xD0\xFB\xD5\xF3\x80\xA1\x6E\xFB\x79\x23\xDB\xD6\x98\xE5\xEC\xE2\xE8\x42\xD6\xB8\xE5\x5C\x88\xAE\xC2\xF4\x8F\xDA\x1F\xEA\xA2\x1F\x45\x0A\x96\xD0\x52\xC4\xCB\xE8\xB3\xD4\xF9\xE0\x36\x83\xF4\x01\xE8\x67\xF7\xAA\xF3\xF0\xFF\xEC\x95\xFC\x0D\xF7\xB3\xE5\xAB\xF1\xCA\xEB\xDE\xF3\xC5\xED\xF7\xA2\xF4\x1F\xFC\x79\xF1\x88\xF9\x18\xF3\xE2", "\xE5\xC6\xE5\xF8\xAF\xF3\xA2\xFB\xD8\xF2\xC7\xF4\x51\xF0\xB2\xEE\xD4\xC1\xEB\x9B\xCA\xBD\xD8\x77\xE3\x0D\x49\xF3\xEE\xD2\xE3\xEA\xCD\xA8\x8A\xD7\x27\x03\xD0\xE0\x7F\xFA\x48\xDC\xE0\xFF\xDD\xCE\xF8\xB6\xF6\x10\xFC\x22\xFD\xC2\xF6\xC8\xF9\xAA\xEF\xCB\xD6\xF8\xE4\xFB\x18\xFC\x24\xF5\xB7\xF5\x4F\xFB\xA4\xE5\xC4\xCF\xE7\x87\xF1\xD1\xF3\x44\xF1\x94\xF0\x25\xF0\x98\xE3\xC3\xC2\xE6\xB8\xF0\x84\xF3\x33\xF3\x8B\xF2\xB4\xF7\xA0\xFE\xCE\xD9\x94\xD2\xD9\x47\x32\xC7\xA7\xB4\x40\xA4\xF5\xE6\xFB\xE2\xFC\x4E\x3E\xEC\xAD\xC9\x22\xF1\x6E\xD5\xCD\xF9\xBD\xE1\xE8\xF0\xF3\x9D\xF0\xE8\xF3\x0F\xF0\xCD\xE8\xCF\xFC\xE2\xF7\xF3\xF6\xE9\xF9\xFC\x41\xF6\x3E\xF6\x87\xF6\x4F\xF8\x97\xF8\xCF\xF6\xDF\xC9\xF6\xA2\xFA\xBF\xF0\xC6\xF4\xBE\xFA\xB1\xE9\xD7\xDC\xEC\xEB\xF5\x5B\xFD\x76\xF5\x97\xFF\x5D\xF8\xA0\xEF\xCC\xF3\xD9\x9A\xFD\x6C\xFC\x20\xFC\x2C\x42\xC8\xF2\x34\xC0\xD2\xE3\xF7\xA7\xFD\xA5\xFD\x24\xFC\x1B\xEB\xC9\xF7\x68\xED\xF2\xEC\xE3\xA2\xFB\x1E\xFC\x71\xF4\x7C\xFE\x62\xF2\xDF\xF3\xF5\xE4\xF8\xB5\xFD\xF6\xFB\x5B\xFC\x7E\xF9\xD7\xFA\xDF\xFB\xF5\xC7\xE4\xBD\xFD\xAD\xED\x79\xD9\x82\xFA\xBB\xFB\xE9\xE2\xF6\xD9\x69\x44\xFD\x47\x1E\x63\xFD\xEA\xEF\xC2\xF9\xEC\xFA\xD6\xCB\xEC\xE9\xFB\xCB\xF3\x5A\xF1\x73\xF6\xCF\xFD\xA4\xE0\xF4\xF4\xEA\x82\xFD\xB6\xF4\x42\xFE\xD3\xF1\x30\xF0\xB5\xE3\xCC\xD2\xED\x85\xF3\x54\xF6\xC6\xEF\x9A\xFB\xBF\x1D\xE8\x1D\x67\xCF\xF7\xC3\xEB\x87\xEA\x9C\xF9\xBA\xE8\x41\xE1\xD8\xCB\x49\xED\xDB\x95\xDC\x1F\xCA\x78\xEF\x49\x04\xD3\xF4\xC0\xEB\xDC\xDF\xF7\x98\xF3\xC1\xF2\xCD\xF3\xB1\xFC\xC2\xF8\xEA\xE6\xF5\xDC\xFC\xAC\xFC\xEA\xFA\x6F\xF4\xAC\xF0\x5C\xF3\xB1\xF2\xF6\xE0\xF8\xD4\xFD\x22\xFC\x6B\xFE\x95\xF8\xDB\xF6\xE2\xFA\xF6\xE8\xF8\xDC\xFD\x2A\xFC\x20\xF3\x7E\x71\x46\xF4\xDD\xED\xBE\xCA\xB9\x92\xEF\xA9\x16\x68\x32\x63\xFB\xE6\xD9\xF3\xD9\x68\xE5\xF5\x8B\xF4\x1E\xDA\xB7\xF7\x6F\xE9\xF5\xC4\xF1\xEA\xE1\xD6\xFC\xBF\xF2\xE0\xFB\xF4\xF2\x78\xFB\xDD\xF4\xEA\xFF\x96\x8A\xFB\xC3\x1E\x0F\xF6\x91\xFD\xC4\xF4\xE4\xFE\xDE\xE6\xF9\xD2\xF9\xA8\xFE\x54\xFC\x95\xFD\x3E\xF2\xB4\xFE\x9A\xE7\xF1\xC0\xE4\xA2\xFB\x04\xF4\x77\xF7\xB7\xFE\xD1\xF7\x23\xEC\xE0\x99\xDD\xE4\xFC\x26\xEE\xED\xF5\x83\x0E\xA2\xC3\xD3\xCE\xB7\xC7\xBD\xC4\xFE\xE6\xFC\x6E\xF3\x83\xFA\x9C\xF9\xF1\xF6\xD6\xF4\xF9\xE8\xFB\x76\xFD\xA7\xFD\xC3\xCC\xD9\xFC\x73\xF2\xFA\xEC\xF7\xD4\xFE\x50\xFC\xAB\xFC\x5F\xF1\xD6\xFB\xB4\xEB\xF1\xFF\xDF\xA9\xF4\x5C\xFF\x15\xF5\x96\xFD\x45\xF1\x90\xEB\xF4\xC6\xFE\xD3\xA5\x34\xFF\x83\xFE\x61\xEF\xF1\xF3\xD1\xD3\xBC\xC6\x09\x3B\xFE\x16\x6C\x8E\xDE\xCF\xF8\xED\xFB\x75\xEA\xFB\xF6\xE8\x9B\x21\x9E\xEE\xB7\xFD\xC4\xF8\xEE\xFE\xCE\xF6\xF4\xE8\xFB\xEC\xE7\x72\xFC\x09\xFF\xC6\xFF\xC8\xFD\xF1\xFA\xFB\xFB\x3C\x51\xFE\x7C\xFD\x6F\xF4\xBD\xF9\x5C\xF6\xEF\xF5\xD8\xF8\xFB\x97\xF6\xFA\xFC\x5C\xF7\xD3\xF2\x57\xF1\xB5\xFC\xD5\xD3\xED\xD9\xF4\xC9\xEF\x2D\xF6\x2E\xF3\xF2\xF2\xF3\xE0\x76\x0F\xDF\xE9\xD5\x58\xDA\x4D\xF2\x56\xDF\x81\x1B\xF9\xED\xE9\xE9\xFD\x9E\xFD\x6B\xFF\xEC\xEF\x49\x00\x27\xFB\x93\xFB\xEE\xF1\xFD\xE1\x35\xA7\xFF\x9F\x1E\xBA\xFD\xFC\xEC\xEE\xEE\xFA\xEE\xFB\x8E\xF6\x7C\xFF\x8F\xF2\xDF\xFE\xC9\xF0\xF8\xE7\xDA\xE2\xF6\x82\xF5\x58\xFE\x7B\xF2\x68\xFC\x2A\xFC\xF2\xF8\xF2\xCF\xFE\x8C\x88\x8C\xFE\xB0\xFE\xE3\xFD\xF8\xFC\xA2\x71\xFC\xF6\xC4\xF1\xD9\x2B\xD2\x0A\xF1\x60\x08\xD8\xF1\xD7\xC5\xFA\xC9\xF1\xAB\xF8\x66\x0F\x77\x78\x1B\x03\x79\x78\x77\x7F\xEF\x7E\x79\x7F\xDF\x7F\x4A\x7E\xDC\x7A\x4C\x7E\xE3\x7F\xCF\x7E\xEF\x7F\x5B\x78\x7F\x7E\x24\x79\x81\x7E\x26\x79\x83\x7E\xAB\x79\x85\x7E\x2A\x79\x87\x7E\x65\x78\x89\x7E\x2E\x79\xF3\x7F\x6D\x78\xBA\x6D\x8D\x7E\xB6\x79\x42\x78\x27\x01\xC2\x73\x57\x77\xC1\x7E\xA5\x7F\xA9\x7C\x73\x7F\x07\x7B\xA9\x7F\x74\x7C\xAB\x7F\x75\x7E\x19\x7A\xAE\x7F\x49\x67\xF0\x7E\x1A\x7E\xCC\x79\x1C\x7E\xD0\x7E\x80\x7A\xE7\x7F\xB0\x7E\x0E\x80\x6C\x75\x85\x7F\xF4\x7F\x71\x4C\x88\x7F\x39\x80\x3E\x4C\x8A\x7F\x3F\x80\x5A\x7E\xBF\x7F\xBE\x7A\xC1\x7F\xC0\x7A\x5D\x79\xD3\x7B\x72\x21\x0A\x7E\xCC\x69\xFE\x7F\x6D\x7C\x00\x80\x52\x75\xA1\x7E\x78\x78\xA3\x7E\xC8\x7E\xDE\x7F\xEF\x79\x2D\x80\x40\x7B\x21\x7F\xB1\x7F\x23\x7F\xB3\x7F\x25\x7F\xB5\x7F\xD3\x7E\xB7\x7F\xD5\x7E\xB9\x7F\x19\x7B\xBB\x7F\x1B\x7B\xBD\x7F\x1D\x7B\x44\x80\x1F\x7B\x46\x80\x21\x7B\xC1\x7A\x33\x7A\x5A\x7B\x1B\x78\x11", "\x7C\xFF\x00\x0C\x7E\x9E\x73\x6E\x80\xFD\x7F\xD7\x7F\xF0\x7B\x70\x7E\x74\x7F\xE1\x7D\x1A\x7F\x4C\x7F\x54\x80\xE8\x77\x2F\x80\xAC\x72\xA8\x7E\x59\x80\xAB\x7E\x7D\x7E\xF7\x79\x10\x80\xF9\x79\x50\x79\x2F\x78\xAA\x79\x7D\x77\x3E\x80\x3C\x80\xFE\x4B\x41\x80\x8D\x80\x63\x48\xF1\x7F\x3F\x80\x61\x7F\xBD\x75\xE9\x7B\x03\x01\xEB\x7B\x1C\x65\x3E\x7E\x02\x01\x4D\x80\x82\x7C\x6E\x7C\x50\x80\x49\x7F\xA2\x7E\xEA\x79\x4A\x76\x1F\x7F\x55\x80\xD7\x7D\x78\x7F\xC5\x79\x82\x80\x43\x7B\xAC\x7E\x20\x7A\x36\x80\x3F\x80\xE8\x7F\x60\x80\x29\x7F\x62\x80\xB4\x7E\x64\x80\xB6\x7E\x66\x80\xB8\x7E\x68\x80\x5C\x7E\x6A\x80\x5E\x7E\x5D\x79\x6D\x80\x7D\x7B\x35\x7A\x0E\x79\x27\x01\xCC\x6D\xAB\x65\xA4\x7F\x00\x7D\x2F\x7D\x9F\x7E\x01\x80\x51\x80\x03\x80\x53\x80\xA4\x80\x7E\x80\x08\x80\xCB\x7E\x0A\x80\xCD\x7E\x0C\x80\x4F\x7E\xE6\x7F\xAE\x80\x38\x80\x90\x80\xB2\x7E\xB2\x80\xD7\x7E\xB4\x80\xD9\x7E\xB6\x80\xDB\x7E\xB8\x80\xBA\x7E\xBA\x80\xBC\x7E\xA0\x6D\x2B\x69\xD4\x7F\x90\x02\xFC\x7F\x0B\x7E\x76\x80\xA3\x7A\x78\x80\x29\x80\x75\x7F\x39\x7B\x7C\x80\xCC\x80\xAC\x77\xA6\x80\x06\x80\xA8\x80\xF1\x7E\x4B\x79\x34\x80\x3F\x80\xD1\x7E\x5E\x80\x27\x7F\xB0\x80\x59\x7F\xD9\x80\x2B\x7F\xDB\x80\x2D\x7F\xDD\x80\x2F\x7F\xDF\x80\xDD\x7E\xE1\x80\x63\x7F\x20\x80\x16\x65\x60\x79\x00\x00\x62\x79\x1D\x65\x9A\x80\x01\x01\x9C\x80\x93\x7C\x9E\x80\x02\x80\x03\x54\x7B\x80\xDC\x7F\x4D\x7F\xCD\x80\x56\x80\xA7\x80\x58\x80\xF5\x80\xA2\x7D\xF3\x7E\x85\x80\xF5\x7E\x11\x80\xF7\x7E\x13\x80\xF9\x7E\x15\x80\xFB\x7E\x86\x7E\xFD\x7E\x88\x7E\xFF\x7E\x8A\x7E\x01\x7F\x0E\x78\xF6\x7F\x00\x7E\x30\x6E\x56\x6C\x0A\x7A\x6F\x80\x8F\x79\x91\x79\xE7\x80\x4C\x80\xE9\x80\x37\x7E\xA0\x7E\xA0\x80\x52\x80\xA2\x80\x9C\x79\xED\x7E\x19\x81\xF3\x80\x1B\x81\x32\x80\xF2\x7E\xF7\x80\x90\x80\xF9\x80\x21\x81\xB6\x7F\x23\x81\xB8\x7F\x25\x81\xBA\x7F\xFC\x7E\xBC\x7F\xFE\x7E\xBE\x7F\x00\x7F\xC0\x7F\x55\x7B\xC2\x7F\x09\x79\xD6\x6D\x68\x34\x36\x81\x5C\x0A\x10\x81\x87\x7D\xBC\x7C\x28\x80\x43\x7E\xED\x80\x45\x7E\x2C\x80\x1A\x81\x48\x7E\xCE\x80\x50\x7F\xE1\x7F\xF3\x79\x3F\x80\x1E\x81\x7F\x7A\xAE\x7E\xF0\x78\xD6\x80\x1D\x80\x03\x54\xD8\x80\x4C\x81\x63\x80\x4E\x81\x65\x80\x50\x81\x67\x80\x52\x81\x45\x80\x54\x81\x47\x80\x5C\x7A\x49\x7D\x3C\x0F\xA5\x7C\x13\x7C\x0D\x81\xC4\x80\x74\x80\x9E\x7F\xD9\x7F\x3B\x0F\xDB\x7F\x43\x79\xDD\x7F\x18\x81\xF2\x80\xE0\x7F\xD0\x80\x7D\x7F\x5A\x80\x53\x7F\x5C\x80\x55\x7F\xFA\x80\x57\x7F\xFC\x80\xEA\x7F\x3F\x80\xEC\x7F\x00\x81\xEE\x7F\x90\x80\x43\x80\x78\x81\x69\x80\x7A\x81\x6B\x80\xBC\x80\x59\x7B\xBE\x80\x9E\x7F\x70\x80\xF1\x6D\x4B\x80\x5A\x81\x38\x81\xC7\x80\x9F\x80\x18\x7F\x7A\x80\x76\x7F\x62\x81\x41\x81\x64\x81\x40\x81\x8C\x81\x31\x80\xAA\x7E\xAA\x80\x84\x80\x6B\x81\x86\x80\xAF\x7E\x88\x80\xFB\x79\x8A\x80\x31\x78\x8C\x80\x6F\x81\xF7\x23\x5D\x7F\x2E\x7F\x5F\x7F\x93\x80\x1C\x80\x96\x78\x6A\x6D\x1F\x80\x6C\x80\xA2\x81\xDD\x7D\xBF\x80\x2C\x75\x9F\x77\x02\x6F\x82\x81\xA3\x81\xD0\x7F\x1C\x78\xC8\x80\x3B\x81\xCA\x80\x3D\x81\x89\x81\xF1\x80\xE7\x7D\xB0\x81\x81\x80\x1C\x81\x69\x81\x45\x81\xC0\x81\xCF\x21\x47\x81\x87\x80\x12\x80\x51\x79\xBD\x81\x53\x79\xBF\x81\xC7\x81\x9D\x6D\xC2\x81\x02\x81\xC4\x81\x90\x80\x94\x80\x06\x81\xF0\x7A\x3F\x80\xC2\x7A\x24\x72\x5D\x73\x0B\x7A\x1B\x65\x64\x7A\xD4\x70\x29\x19\x9C\x7F\x2C\x7B\x9B\x10\xA8\x7B\x40\x73\x63\x7B\xE5\x7E\x26\x80\x5D\x81\xEB\x80\x5F\x81\xAD\x81\xEE\x80\x16\x81\x7D\x80\xDA\x81\x11\x7C\xDC\x81\x20\x7F\xDE\x81\x90\x80\x6A\x81\xAD\x7E\xB9\x81\x6D\x81\xBB\x81\x26\x7A\xE7\x81\xFD\x79\x16\x80\xAD\x79\x8F\x80\xE1\x81\xF0\x7F\x1A\x80\x03\x7A\xC6\x81\x89\x79\x9E\x59\xC9\x81\xAD\x7D\x9B\x72\x54\x7D\x23\x7D\x20\x6E\x96\x7A\x22\x6E\x83\x30\xCE\x7F\x9D\x7F\xD3\x81\x2B\x69\x45\x7C\xCF\x81\x1D\x7D\x02\x82\xC5\x80\x66\x7E\x85\x81\xAD\x6E\x11\x7E\x2B\x80\xEF\x80\xAC\x7F\x3F\x81\x8B\x81\x09\x80\xB4\x81\x7B\x7E\x83\x80\xB2\x7F\x1F\x81\xB4\x7F\x48\x81\x5F\x80\x4A\x81\x61\x80\x72\x81\xB3\x80\x74\x81\xB5\x80\x76\x81\xB7\x80\x9D\x81\xB9\x80\x9F\x81\xBB\x80\x5C\x7A\x5C\x7B\x64\x74\x24\x7B\x26\x82\x30\x7D\x39\x6E\x3B\x0A\x3B\x6E\x60\x67\x57\x82\x53\x73\xCD\x7A\x42\x7F\x43\x0F\x12\x7F\x09\x01\x5B\x81\x5D\x82\x06\x7E\x48\x7F\xAC\x81\x4A\x7F\x15\x81\x88\x81\x17\x81\x0B\x82\xAC\x78\x3B\x82\xFB", "\x39\xA9\x80\x1B\x7E\xAB\x80\x45\x7B\xAD\x80\x90\x80\xAF\x80\x47\x82\xB1\x80\x49\x82\xDA\x80\x4B\x82\xDC\x80\x4D\x82\xDE\x80\x4F\x82\xE0\x80\x51\x82\xE2\x80\x22\x7B\xCB\x77\x29\x74\xCF\x7F\xC6\x80\x44\x7D\xF8\x7A\x31\x3F\x50\x6E\x3F\x7F\x0D\x79\x55\x6E\x60\x82\x3F\x0F\x62\x82\x06\x01\x64\x82\x71\x7D\xE7\x7E\x5E\x81\xC5\x7E\x38\x82\x18\x79\x57\x80\xB1\x81\x3D\x82\xCF\x80\x3F\x82\x0B\x80\x8F\x81\x7F\x7F\x91\x81\x81\x7F\x93\x81\x83\x7F\x3F\x80\x71\x81\x8B\x80\x19\x82\xFF\x79\x18\x80\x2C\x79\x1E\x82\x2E\x7A\x2C\x81\x05\x79\x2E\x81\x2A\x74\xF2\x7A\x23\x7B\x46\x02\x5C\x81\xF3\x18\x28\x7B\x64\x09\xB9\x0D\x5C\x82\x95\x82\xCC\x7A\x6C\x6E\x27\x01\x8A\x12\x69\x6F\x37\x81\x03\x82\xD5\x7C\x97\x82\xE9\x7E\x99\x82\x0A\x7B\xB3\x81\x07\x80\xB2\x81\x3E\x82\xF1\x79\x0F\x82\x1C\x82\x20\x76\xB7\x81\x12\x82\x20\x81\xE4\x81\x22\x81\xE6\x81\x14\x80\xA9\x82\x26\x81\x17\x80\x28\x81\x19\x80\x2A\x81\x1B\x80\xB0\x82\x87\x79\x56\x7B\x90\x80\x09\x7A\xC4\x82\xE0\x1B\x54\x82\xC0\x0A\xF0\x6A\x85\x6E\x67\x7A\x91\x82\xA0\x6E\x65\x7B\x5A\x77\xEA\x82\xFF\x7D\x85\x6C\xE3\x7E\x3D\x7E\xA9\x67\x6A\x7E\x9D\x7E\x88\x82\xD4\x81\xAB\x81\xD4\x7A\x60\x81\x73\x7E\xAF\x81\xCA\x82\x2E\x80\x65\x81\x7B\x7F\x8D\x81\xE2\x7F\xA1\x82\xE4\x7F\xA3\x82\xD4\x80\x76\x82\x6E\x81\xEA\x81\xBA\x6D\xA8\x82\xBE\x81\xAA\x82\x2A\x7A\xAC\x82\x01\x7A\xAE\x82\x8D\x7F\xE0\x82\x06\x7A\x03\x7F\xA1\x0C\x01\x01\xFE\x7D\x6B\x7B\xF7\x7F\x1B\x77\x02\x7E\xE7\x76\x8A\x75\x8C\x75\x66\x82\x0D\x7F\x9A\x6C\xF3\x82\x62\x7D\xB9\x69\xF6\x82\x15\x7F\xDE\x7D\x67\x82\xFB\x82\x07\x82\x61\x81\x3A\x82\x9B\x82\xAD\x7F\x01\x83\xAF\x7F\x67\x81\xCE\x7E\xD3\x80\x51\x7E\xA6\x82\xD7\x80\x3B\x80\xD0\x82\x4D\x7B\x4D\x81\x27\x81\x4F\x81\x29\x81\x51\x81\x2B\x81\x53\x81\x02\x7F\x3C\x7C\x83\x75\xE4\x76\x35\x7F\x32\x7E\x80\x65\x34\x7E\x39\x5F\x36\x7E\xC7\x80\x70\x76\x42\x63\x77\x74\xCD\x75\xE4\x7E\x42\x6A\x28\x83\x46\x7F\x2A\x83\x3A\x81\x68\x82\xA1\x80\x4B\x7F\x09\x82\xF0\x80\xEE\x79\x9D\x82\x66\x81\x03\x83\x68\x81\x10\x82\xE0\x81\x0B\x83\x03\x54\xE3\x81\xBA\x81\xE5\x81\x89\x80\xD8\x82\x0E\x83\xDA\x82\x1A\x82\x11\x83\x2C\x7A\x13\x83\xF2\x7F\x15\x83\x8C\x7E\xB2\x82\x81\x72\xF9\x6D\x60\x7E\x03\x76\x80\x74\xE6\x31\x1B\x83\x42\x7D\x96\x7E\xE7\x7D\xFF\x00\x0C\x76\x53\x83\x71\x6D\x55\x83\xFF\x7F\x47\x7F\x58\x83\x2C\x83\x69\x82\xAE\x81\x2F\x83\x63\x81\x31\x83\xCC\x82\x9E\x82\xCE\x82\x43\x81\xF6\x80\x73\x82\x1D\x7E\x75\x82\x3B\x83\xBB\x78\x0A\x83\x21\x82\x6A\x6D\x0D\x83\xE8\x81\x0F\x83\x89\x7F\x6F\x83\x8B\x7F\x71\x83\xC5\x81\x73\x83\x3F\x80\x23\x82\x7C\x81\xD1\x6C\x37\x76\x91\x7E\xD4\x6C\x93\x7E\xEB\x82\x2D\x82\xF8\x82\x8F\x79\xDB\x6C\x59\x81\x69\x7E\xA9\x81\x22\x83\xD5\x81\x59\x83\x3C\x81\x5B\x83\x6B\x82\x0A\x82\x5E\x83\xDB\x81\xFF\x82\x42\x81\xB5\x81\x72\x82\xD2\x82\xAC\x80\x6C\x81\x24\x7A\x15\x82\x4A\x7B\x17\x82\x28\x7A\x9D\x83\x3F\x80\xEC\x81\x7E\x82\x03\x81\x80\x82\x05\x81\x82\x82\x07\x81\x5F\x7E\x2B\x69\xBF\x7E\xBB\x79\x27\x83\xB3\x83\xF9\x82\x13\x81\xF7\x23\x6A\x82\xEB\x79\x6C\x82\xBB\x83\x0C\x82\xBD\x83\xE5\x7D\x71\x82\x33\x80\x93\x83\x35\x80\xC3\x83\x48\x7B\xC5\x83\x84\x7F\xC7\x83\xEB\x7F\xE9\x81\x99\x83\xEB\x81\x1B\x82\x65\x83\xF7\x23\x9C\x81\x42\x83\x79\x81\x6B\x78\xE2\x82\x96\x83\xD5\x7D\x6E\x82\x8E\x10\xE1\x76\xC0\x7D\x81\x81\xE6\x65\x84\x83\x4E\x80\x86\x83\xB5\x83\x88\x83\x5A\x83\xDB\x83\xA3\x80\x6F\x82\x8A\x81\xBC\x83\xCD\x82\xF4\x80\x91\x83\x1D\x81\x64\x83\xED\x83\xBA\x6D\x67\x83\x14\x82\x69\x83\xBC\x81\x6B\x83\x9C\x83\x6D\x83\xAB\x82\xDC\x82\xAD\x82\xDE\x82\x1F\x82\xA3\x83\x90\x80\x2D\x7E\x3A\x0F\x2F\x7E\x5A\x77\x54\x59\x37\x7D\x33\x7E\xE8\x76\x38\x14\x03\x6D\x8E\x75\x16\x65\x0F\x7F\x2B\x77\x6F\x7F\xFE\x83\xD7\x83\x36\x82\x7F\x08\x2D\x83\xFD\x82\x8B\x83\x0D\x82\xA5\x80\x09\x84\x8F\x83\x0B\x84\xBF\x83\xE3\x83\xC1\x83\x74\x82\xE6\x83\x37\x80\xE8\x83\xA7\x82\x3A\x83\xF0\x83\xD3\x76\xC9\x83\x90\x80\xCB\x83\x40\x83\x77\x81\xF3\x83\x9E\x81\xF5\x83\x55\x81\x35\x79\x36\x7F\x61\x6E\x38\x7F\x6D\x0C\x3A\x7F\xCA\x7F\x42\x63\xD4\x77\x46\x6D\x6A\x6E\xFD\x6D\x16\x65\x2A\x77\x00\x82\x43\x7F\x2E\x84\xE5\x82\xC3\x7E\xC6\x82\xA8\x7F\xFC\x82\xAA\x7F\x34\x84\xE0\x83\x8D\x83\x5F\x83\x02\x83\x9F\x82\xD1\x80\x05\x83\x0D\x80\x46\x81\x95\x83\x43", "\x84\x09\x50\x98\x83\xA9\x73\x9B\x83\x18\x82\x17\x84\x10\x83\x19\x84\x12\x83\x1B\x84\xAF\x82\x43\x83\x2D\x81\xF6\x83\x70\x84\x01\x76\x26\x71\x1E\x5C\x67\x7F\x2C\x82\xFD\x81\x48\x0F\x6D\x7F\x10\x7F\xA0\x77\xD6\x83\x5F\x84\x96\x82\x05\x82\x98\x82\x2A\x80\x9A\x82\x8C\x83\x3C\x82\x37\x84\x60\x83\x6A\x84\x8E\x81\x41\x82\x5B\x80\x43\x82\x5D\x80\x45\x82\xFB\x80\x78\x82\xFD\x80\x7A\x82\xFF\x80\x7C\x82\x01\x81\xCC\x83\xEE\x81\x96\x83\xF0\x81\xD0\x83\xF2\x81\xE3\x82\x4F\x84\xF4\x7A\x3F\x6D\x96\x7F\x27\x18\x54\x84\x22\x77\xCC\x7F\x45\x6D\x8D\x82\xCD\x81\x3C\x0F\xA1\x7F\x88\x84\xD0\x81\x5E\x84\x34\x82\xA6\x7F\x61\x84\xDA\x7F\xC8\x82\x05\x80\x66\x84\x92\x84\xDF\x83\x0A\x84\xBE\x83\x40\x82\xB6\x81\x42\x82\xB8\x81\xD4\x82\x68\x83\xD6\x82\x6A\x83\x24\x81\xD9\x82\x3D\x83\xDB\x82\x3F\x83\xDD\x82\x41\x83\xDF\x82\x7C\x84\xB1\x82\x7E\x84\x0F\x84\x62\x67\xAA\x84\x5D\x7B\x9E\x09\xD0\x77\xED\x48\x66\x7D\x8A\x82\x16\x36\xCD\x7F\x94\x7E\x87\x82\x66\x7E\x2B\x69\xDA\x77\xC2\x59\xB1\x83\x09\x01\xFF\x83\x9D\x80\x4F\x80\xD9\x83\xCF\x21\x05\x84\x3E\x81\x36\x84\xC2\x84\x38\x84\xC4\x84\xA0\x82\x97\x84\x90\x81\x99\x84\x92\x81\x9B\x84\x94\x81\x9D\x84\x96\x81\x90\x80\x98\x81\xA1\x84\x9A\x81\x96\x83\xF2\x83\xD4\x84\xF4\x83\x7D\x84\x4D\x84\xA2\x7D\x8C\x11\xF9\x7F\x98\x16\xE9\x84\x06\x01\xEB\x84\x11\x81\xED\x84\xC9\x80\x14\x81\x8A\x83\x5C\x83\x07\x84\x6D\x82\x12\x78\x35\x84\xD3\x52\xE2\x83\x44\x81\xE4\x83\xF8\x80\x6F\x84\xD8\x84\xF7\x23\x77\x82\xD7\x82\xCD\x84\x6C\x83\xCF\x84\x6E\x83\x78\x84\x70\x83\x7A\x84\x14\x83\xD5\x84\xE1\x82\x08\x85\xF3\x81\x21\x80\xCA\x73\xDD\x70\xF5\x82\x2F\x84\xBC\x84\x86\x81\xBE\x84\xFE\x82\xC3\x84\x9C\x82\x93\x84\x69\x84\x90\x83\x3A\x84\x1C\x85\x3C\x84\x94\x83\x3E\x84\xD5\x80\x40\x84\x39\x83\xEA\x83\x97\x81\xEC\x83\xA9\x73\x47\x84\xD2\x84\x49\x84\x05\x85\x4B\x84\x07\x85\x7B\x81\xC3\x7F\x49\x80\xB7\x2C\x82\x83\xFB\x69\x0F\x85\xB7\x82\x41\x7E\x35\x85\x37\x82\x8F\x84\xC9\x82\x39\x85\x67\x84\x3B\x85\x33\x83\x61\x83\x35\x83\xE5\x7F\x37\x83\x53\x7E\xFE\x84\x96\x83\x00\x85\x3E\x83\x75\x81\x48\x84\x4E\x82\x4A\x84\x50\x82\x4C\x84\x50\x85\x09\x79\xBD\x80\xCC\x81\xA4\x81\xF9\x83\x71\x0F\x72\x80\xA1\x7A\x5C\x0A\x56\x85\x65\x82\xD8\x83\x12\x85\xDA\x83\x14\x85\xB9\x83\x5D\x83\x78\x7A\xF3\x84\x94\x84\x3D\x85\xC5\x84\xC0\x83\xC7\x84\xD3\x82\x44\x82\xD5\x82\x49\x81\x23\x85\x4B\x81\xCE\x84\x73\x81\x69\x85\x4C\x82\x6B\x85\x7F\x82\x6D\x85\x81\x82\x8C\x77\x96\x80\x02\x01\x98\x80\x17\x83\xCC\x69\x7A\x85\xBD\x82\xD8\x7F\x59\x85\x31\x84\x89\x83\x08\x82\x80\x85\x16\x85\xDE\x83\x75\x85\x19\x85\xCA\x79\x0C\x84\xDF\x81\x1D\x85\x6E\x84\x42\x85\x09\x83\x44\x85\x96\x83\x74\x84\xC8\x83\x76\x84\x9E\x83\x28\x85\xA0\x83\x2A\x85\x72\x83\x2C\x85\x30\x7A\xD7\x84\x32\x7A\xCB\x81\x0D\x7E\x9E\x7F\xC0\x80\x1E\x2B\x0D\x85\x03\x01\x9D\x85\xF6\x7A\x04\x82\xBF\x79\xB6\x83\xD7\x81\xB8\x83\xDC\x83\xBA\x83\x82\x85\xA7\x85\xC0\x84\x70\x82\xCF\x82\x7F\x84\x74\x77\xAC\x85\x96\x83\x11\x84\xC4\x83\x13\x84\x16\x82\x15\x84\x75\x84\x26\x85\x18\x84\xD1\x84\x1A\x84\xD3\x84\x1C\x84\xBA\x85\x74\x83\xBC\x85\xD4\x7D\xE4\x80\x27\x01\xB9\x79\x1D\x65\x18\x78\x0E\x85\x34\x85\x8D\x84\xC7\x82\x5B\x85\xBF\x84\x5D\x85\xC1\x84\xCF\x85\xF2\x85\xD1\x85\xAA\x85\x63\x83\xD5\x85\xD3\x85\xEE\x78\xAE\x85\x96\x83\x22\x85\xCC\x84\x8E\x85\x25\x85\x90\x85\xD0\x84\x6A\x85\x4B\x85\x6C\x85\x4D\x85\x6E\x85\x4F\x85\xA0\x81\x5C\x7A\xBC\x6D\xCF\x64\xA7\x81\xB2\x83\x8B\x84\x72\x7F\xEE\x85\x62\x84\x32\x84\x64\x84\x15\x85\x30\x83\xF3\x85\x18\x85\xD0\x85\x1A\x85\xD2\x85\x20\x85\x5F\x75\x0E\x84\xA9\x73\xD7\x85\xE7\x83\xD9\x85\xC6\x83\xDB\x85\xB3\x85\xDD\x85\x77\x84\xDF\x85\x79\x84\xE1\x85\x7B\x84\x06\x85\xD6\x84\x2E\x85\xE3\x82\x72\x85\xBF\x85\xD3\x81\x75\x85\x90\x79\x27\x01\x92\x79\xEA\x85\x33\x85\x10\x86\x9F\x85\x12\x86\xBD\x84\xF0\x85\x38\x85\xF4\x84\x3A\x85\x83\x85\x3C\x85\x39\x84\x86\x85\x3B\x84\x88\x85\xC2\x83\x13\x82\xD8\x85\xCB\x84\x14\x84\x24\x85\x16\x84\x27\x86\xB5\x85\x29\x86\x29\x85\x2B\x86\x2B\x85\x2D\x86\x2D\x85\x70\x85\x35\x79\x57\x81\xC5\x22\xC3\x85\x02\x01\xC5\x85\x7D\x83\x27\x80\x3C\x86\x36\x85\x3E\x86\x65\x84\xF5\x85\x08\x84\x42\x86\x60\x85\x95\x84\x04\x83\xF7\x84\xA2\x82\xF9\x84\xA4\x82\xFB\x84\x38\x83\xB1", "\x85\x42\x84\x1D\x86\x20\x4C\x48\x85\xC2\x75\x4A\x85\xE0\x85\x4C\x85\xE2\x85\x55\x86\xBB\x85\x2F\x86\xF7\x83\x7D\x81\x44\x0F\x7F\x81\x0E\x86\xEA\x84\xED\x85\xC8\x85\x03\x84\xB7\x83\xF0\x84\xD9\x81\xA6\x85\x19\x86\x64\x86\xA9\x85\x3E\x85\x92\x83\x40\x85\xE5\x83\x49\x86\x22\x86\x4B\x86\xDA\x85\x4D\x86\xDC\x85\x02\x86\x27\x85\x51\x86\xB7\x85\x53\x86\xB9\x85\x7A\x86\xE4\x85\x7C\x86\xFA\x85\xE4\x82\xBA\x84\xF7\x7A\x8F\x79\xA6\x81\x54\x85\x9C\x85\x83\x86\x17\x7F\x85\x86\xCA\x85\x87\x86\xDD\x83\xCE\x85\x8A\x86\x40\x86\xDD\x81\xF7\x85\x96\x83\x11\x82\x48\x86\xC9\x84\x12\x84\x93\x86\x24\x86\x95\x86\x26\x86\x97\x86\xDE\x85\x04\x86\x77\x86\x06\x86\x79\x86\x4E\x85\x2E\x86\x57\x86\x09\x85\x31\x86\x6E\x7E\xC0\x85\xCE\x81\xA2\x7F\x89\x84\x54\x83\xA8\x86\x2B\x83\x37\x7B\x63\x84\x39\x82\x16\x86\x91\x84\xF2\x84\xF4\x85\xB0\x86\x0E\x82\xB2\x86\xFA\x85\xB4\x86\x3D\x84\x91\x86\x3F\x84\x23\x86\xE9\x83\x25\x86\xEB\x83\x45\x84\x96\x83\x76\x86\x2A\x86\x78\x86\x2C\x86\xC2\x86\x56\x86\x0A\x86\xC3\x7F\x90\x7A\x39\x06\x57\x85\x38\x6E\x42\x63\xF9\x81\xBB\x71\xB3\x84\xC8\x86\x3C\x0F\xFF\x81\xCF\x7A\xB9\x84\x83\x81\xD3\x81\x30\x84\x57\x6F\x04\x84\x7F\x85\xCC\x85\x81\x85\x3D\x7B\x5F\x85\x30\x80\x85\x85\xF6\x84\xC6\x84\x98\x84\xC8\x84\x8A\x85\xCA\x84\x8C\x85\xFF\x85\x48\x82\x8F\x85\x4A\x82\x91\x85\x7D\x82\x93\x85\xCD\x83\x95\x85\xCF\x83\x6F\x85\xEA\x86\xB9\x7D\x25\x82\x9E\x85\x65\x6E\x6D\x7D\xBA\x08\x97\x7A\x2B\x82\xE3\x84\xAD\x83\xE5\x84\x9D\x7A\x01\x7B\x2D\x84\x8A\x84\xA2\x86\xC7\x85\xA9\x86\xCF\x86\x14\x86\xD1\x86\xA4\x85\x17\x86\xD4\x86\xAF\x86\x84\x85\x44\x86\x05\x87\x87\x85\x07\x87\x89\x85\x9A\x84\x8B\x85\x46\x82\x8D\x85\x0D\x87\x01\x86\x0F\x87\x03\x86\x92\x85\x05\x86\x94\x85\x07\x86\x96\x85\x09\x86\x52\x82\xEB\x86\xB5\x82\xF6\x81\x33\x81\x59\x82\xEB\x64\x5B\x82\xAB\x2D\xEE\x86\x3F\x6E\x44\x0F\xCE\x7A\x02\x7B\xF8\x86\xD2\x81\xF8\x82\xFB\x86\x55\x74\xFD\x86\xA3\x85\xFF\x86\xA5\x85\xAE\x86\x1C\x79\x1A\x86\x8C\x86\x45\x86\x3F\x85\x47\x86\xDB\x86\xB6\x86\x4A\x86\x0B\x87\x4C\x86\x00\x86\x4E\x86\xBC\x86\x28\x86\xBE\x86\xE5\x86\xC0\x86\xE7\x86\x08\x86\xC3\x86\x17\x87\x35\x79\xE7\x82\xEB\x0A\xB6\x82\x7B\x85\x4E\x6E\x8B\x82\xFA\x7A\x51\x6E\x58\x84\xD2\x75\x2B\x69\x69\x7C\x31\x82\xB9\x82\x79\x85\xCD\x86\x87\x83\x2A\x87\xA2\x85\x2E\x83\xD2\x86\xA8\x85\x89\x86\x5D\x87\x8B\x86\x81\x78\x8D\x86\x0D\x84\xF9\x85\x72\x86\x0F\x80\x64\x87\x92\x86\x66\x87\x94\x86\x68\x87\x96\x86\x3D\x87\x98\x86\x6C\x87\x52\x86\xE6\x86\x54\x86\xE8\x86\x7B\x86\xC4\x86\xF3\x81\x74\x87\x1D\x77\x56\x82\x1A\x87\x27\x82\x5F\x6F\xA0\x0D\x68\x6E\xF3\x86\x2E\x82\x16\x65\x2E\x7B\xC1\x82\x6D\x6B\x39\x86\x27\x87\xC5\x82\x60\x86\x5A\x85\xD0\x86\x90\x84\x89\x87\x5C\x87\x1B\x7A\x68\x86\x62\x83\xB3\x86\x1F\x86\xC2\x75\x21\x86\xDD\x86\xB8\x86\xDF\x86\xBA\x86\xE1\x86\xB4\x85\xCA\x83\xEF\x83\x91\x87\x39\x48\x92\x80\xEF\x81\x20\x82\xB1\x7D\x75\x83\x9B\x74\xB6\x1C\xC6\x86\xF7\x82\x66\x7E\xA3\x87\xC6\x7F\xA5\x87\xED\x5E\x60\x7B\x22\x30\xB9\x82\xC5\x09\x82\x6E\xEF\x82\xBB\x73\x3D\x59\x7C\x83\xED\x65\xD3\x83\x27\x01\x68\x6F\xD6\x7D\xD2\x6B\x9B\x10\x86\x7B\xC6\x37\xE7\x71\x41\x10\x19\x87\xD9\x6F\xDB\x6E\x8E\x16\xE6\x87\xE4\x70\x97\x72\x09\x01\x8A\x00\x8D\x6F\xD3\x7F\xD7\x83\xEC\x86\xC6\x71\x66\x13\x24\x33\x6A\x2F\x18\x70\xAA\x6B\x27\x01\x8B\x00\x1C\x7D\xE4\x6F\xB6\x18\xB3\x53\x0E\x05\xC0\x69\x8D\x2F\x90\x6D\x15\x7D\x01\x88\x3F\x75\x03\x88\xCE\x21\x05\x88\x79\x00\xC9\x07\xC2\x2F\xAE\x84\xDF\x84\x13\x7D\xF2\x82\x09\x01\xFC\x83\x32\x82\x42\x6A\xDC\x6C\xD3\x87\xBB\x84\x09\x01\xE3\x00\x32\x81\xFF\x58\x32\x53\x56\x87\x82\x0B\x2B\x87\xB7\x87\x5E\x87\x8A\x87\xBA\x87\x04\x87\x6B\x84\x6A\x86\x06\x83\x6C\x86\x08\x83\xFD\x85\x72\x84\xC2\x75\xB2\x85\xC5\x87\x4F\x86\xC7\x87\x9F\x83\x42\x80\xCB\x87\xA5\x84\xCD\x87\xC2\x75\x1F\x84\x21\x74\x04\x7F\x1A\x83\x1B\x6D\x92\x7F\x24\x84\x4A\x83\x95\x6C\x04\x7E\x8B\x75\xEA\x80\xCC\x6C\x08\x7E\x17\x88\xF7\x86\xB9\x69\x1B\x88\x29\x83\x6F\x7E\x06\x01\x1F\x88\x03\x82\xCF\x5E\xCF\x74\x84\x86\x85\x87\x58\x87\x87\x87\x2D\x87\xD3\x86\x65\x86\xD5\x86\x31\x87\xF5\x84\x2B\x88\x06\x87\xF8\x84\x08\x87\x37\x87\x0A\x87\x39\x87\x0C\x87\x79\x82\x0E\x87\x7B\x82\x10\x87\xA2\x84\x12\x87\xA4\x84\xFA\x85\xA6", "\x84\x44\x83\x19\x65\x21\x84\x9C\x7F\x23\x84\x49\x83\xA5\x68\x4B\x83\x66\x67\xDA\x0B\x19\x25\x4E\x83\x35\x76\x50\x83\x26\x7D\x00\x00\x3C\x7E\xA3\x7F\xE6\x65\x4E\x88\x56\x83\x50\x88\x03\x01\x52\x88\x27\x87\x54\x88\x0C\x7F\x02\x84\x57\x88\x86\x86\xFE\x86\x06\x84\x2E\x87\x5C\x88\x30\x87\x43\x86\x5F\x88\x96\x84\x61\x88\x6B\x86\x63\x88\xFA\x84\x38\x87\x9C\x84\x3A\x87\x68\x88\x3C\x87\x6A\x88\x3E\x87\x11\x87\x40\x87\x13\x87\x42\x87\x15\x87\x44\x87\x83\x82\x5F\x7E\x02\x76\xE7\x42\x04\x76\x53\x1C\xFF\x7D\x95\x7E\xA3\x86\x8F\x79\x81\x83\x25\x87\x1A\x88\x83\x87\x00\x00\x88\x88\xF9\x86\xF4\x52\x8A\x88\x23\x88\x50\x11\x25\x88\x5C\x85\xD6\x86\x2F\x87\x8B\x87\xBF\x88\x1B\x86\xD8\x86\xC9\x87\xEB\x59\xBE\x87\x07\x7F\xC0\x87\x43\x85\xDE\x86\x41\x84\x46\x85\xFF\x84\x74\x86\x07\x7F\xE4\x86\x9C\x87\x6E\x87\x9E\x87\x70\x87\xE9\x86\x45\x87\x09\x79\x36\x76\x24\x87\x38\x76\x91\x30\xFC\x81\x37\x73\x98\x7E\x26\x32\x81\x86\x99\x7E\x3A\x86\x77\x80\x51\x88\x20\x88\xEF\x53\xBA\x88\xA0\x85\xFC\x86\x8E\x88\x59\x87\x90\x88\x5B\x88\x17\x85\xC1\x88\x5E\x88\xE1\x83\x1C\x86\xA9\x73\xDA\x86\x41\x85\xDC\x86\xCA\x88\xC2\x87\xCC\x88\xE0\x86\x47\x85\xE2\x86\xFA\x85\xD1\x88\x9A\x86\x9D\x87\x9C\x86\x9F\x87\x9E\x86\xA1\x87\xE3\x82\x2B\x69\x10\x66\x5C\x84\xC2\x71\x20\x65\xCF\x08\xBC\x26\xAB\x87\xF8\x82\xE3\x87\x63\x82\xE1\x88\xE0\x88\xE3\x88\x48\x88\x87\x88\xE6\x88\x1F\x57\xE8\x88\xB4\x87\xA1\x85\x58\x88\x33\x84\x88\x87\x27\x88\xB9\x87\x88\x86\x19\x7E\x8E\x87\xAB\x85\x8F\x86\x1E\x85\xFC\x85\xFA\x85\xFE\x85\x67\x87\x3B\x87\x69\x87\x99\x87\xBD\x86\x3F\x87\xBF\x86\x41\x87\xC1\x86\xD5\x88\xA0\x87\x72\x87\x09\x85\x5C\x7D\x8D\x63\xFB\x83\x4C\x88\xB4\x88\x14\x89\x39\x81\xB6\x88\x17\x89\xB9\x88\x22\x88\xE9\x88\x57\x87\xEB\x88\x59\x88\x5A\x87\x91\x88\xEF\x88\x29\x88\x32\x87\x60\x88\x34\x87\x62\x88\x36\x87\x9A\x88\x65\x88\x9C\x88\x67\x88\x9E\x84\x69\x88\xA0\x84\x6B\x88\x02\x85\xFA\x85\x04\x85\x32\x89\x43\x87\x05\x79\x9B\x85\x5C\x02\x40\x88\x41\x7D\xB3\x82\x1D\x83\x47\x0F\x01\x6D\x27\x84\xEA\x76\x29\x84\x05\x6D\x90\x82\x3B\x0F\x31\x7B\x27\x01\x84\x88\x85\x83\x57\x83\x3E\x89\x53\x88\x41\x89\x1A\x89\xEA\x88\xAB\x86\x8F\x88\xF1\x84\x92\x88\xF0\x88\x94\x88\xF2\x88\xC4\x88\xF4\x88\xC7\x88\x1C\x83\xFB\x85\xF7\x88\xAF\x85\xCB\x88\x45\x85\xFB\x88\xCE\x88\xFD\x88\xC5\x88\xFF\x88\x38\x88\xA1\x83\xCC\x87\x1D\x84\x96\x83\xA5\x83\xC3\x7F\xDA\x84\x55\x82\x46\x02\x1F\x77\x6C\x00\x98\x7F\xDA\x72\x3D\x7F\xB2\x84\xDD\x88\x7D\x87\x5A\x84\x69\x89\x3A\x0F\x92\x82\x13\x89\xB2\x87\x58\x85\x1E\x88\x3F\x89\x73\x38\x72\x89\x56\x88\x71\x7E\xB6\x87\xBE\x88\xF1\x88\x5E\x85\x66\x86\x03\x87\x4A\x89\x96\x88\x4C\x89\x98\x88\x4E\x89\x6D\x86\x9B\x88\xFC\x84\x9D\x88\x53\x89\x9F\x88\x55\x89\xA1\x88\x6C\x88\xA3\x88\x6E\x88\xC5\x88\x70\x88\xA7\x88\xD1\x83\x5D\x79\xC3\x80\x2B\x6D\x75\x30\x9A\x89\x40\x7F\x6C\x7F\x9D\x89\x63\x6F\x5C\x0A\x6D\x89\x00\x84\x6F\x89\xB7\x88\x54\x87\xA5\x89\xD4\x5E\xBB\x88\x64\x11\xBD\x88\xF1\x85\xC2\x88\x48\x89\x21\x89\x7A\x7E\x33\x87\x46\x86\x35\x87\xB5\x86\x09\x87\xB7\x86\x95\x87\xB9\x86\x97\x87\xBB\x86\x2D\x89\x6B\x87\x2F\x89\x6D\x87\x31\x89\x6F\x87\x5B\x89\xD6\x88\xA8\x88\x5D\x79\x91\x89\xE8\x82\x40\x6D\x94\x77\xAF\x84\x96\x77\xB1\x84\x5C\x6D\x84\x84\x59\x84\xB5\x84\xCA\x89\x3C\x7F\xFB\x69\xCD\x89\xEC\x84\x01\x84\xD0\x89\x73\x85\x18\x89\xA6\x89\x29\x87\xA8\x89\xD6\x89\x3F\x86\xAB\x89\x18\x86\x79\x89\x67\x86\x2A\x88\xB0\x89\xDD\x89\x4D\x89\xDF\x89\x64\x88\xE1\x89\x66\x88\x2A\x89\x9E\x88\x2C\x89\xA0\x88\x9A\x87\xE8\x89\xD2\x88\xEA\x89\xD4\x88\xEC\x89\x34\x89\xD7\x88\x4E\x84\x47\x87\xDD\x84\x13\x88\xF7\x81\xE0\x84\x9A\x7F\x99\x89\xF8\x89\x9B\x89\xD2\x7F\x09\x01\xE5\x80\xFD\x83\x4D\x88\xB5\x88\x01\x8A\x32\x86\x40\x89\xD3\x89\x42\x89\x24\x88\x86\x87\x1D\x89\x5A\x88\xB8\x87\x01\x87\xAD\x89\x80\x80\xD7\x86\x23\x89\xF8\x85\x25\x89\xAD\x85\x81\x89\x30\x88\xB0\x85\xFA\x85\x33\x88\xFC\x88\xC6\x87\x46\x84\xC8\x87\xA9\x73\x59\x89\xEB\x89\xA6\x88\x71\x87\x20\x8A\x36\x89\x0B\x85\x09\x01\x0A\x81\x9B\x85\xCC\x89\x30\x8A\xA4\x89\x2F\x2B\x04\x8A\xCE\x86\x06\x8A\x37\x8A\x15\x86\x39\x8A\x1F\x89\x3B\x8A\x5D\x88\x7A\x89\xB1\x86\x3F\x8A\xBD\x87\x90\x87\x20\x86\x1F\x85\xA9\x73\x29\x89\x96\x87\x2B\x89\x98\x87\x18", "\x8A\x2E\x89\xA2\x88\x30\x89\xA4\x88\x5A\x89\x4F\x8A\xED\x89\xC2\x89\x0B\x86\xB9\x7B\x22\x80\x12\x89\x90\x01\x58\x8A\x71\x89\x34\x8A\x73\x89\x43\x89\x75\x89\xEC\x88\x77\x89\xD9\x89\xAD\x86\xDB\x89\x4B\x89\x0F\x8A\xB2\x89\x11\x8A\x4F\x89\x13\x8A\x51\x89\x15\x8A\xB8\x89\x17\x8A\xBA\x89\x19\x8A\x72\x8A\xE9\x89\x74\x8A\x4E\x8A\x31\x7F\x8E\x89\xCF\x87\x6C\x67\xBA\x7B\x70\x67\xB3\x88\x71\x6D\xFE\x89\x10\x85\x00\x8A\x59\x8A\xCF\x1E\x5B\x8A\x84\x87\x5D\x8A\x1C\x89\x5F\x8A\x46\x89\xEE\x88\x28\x88\xDA\x89\xA9\x7E\x60\x87\x8E\x86\x62\x87\xF6\x88\x93\x87\xC1\x87\xE2\x89\xC3\x87\xE4\x89\x34\x88\x6A\x87\x50\x86\x9B\x87\x00\x89\xD3\x88\x02\x89\x33\x89\x04\x89\x35\x89\xF3\x81\xD2\x87\x4F\x88\x74\x85\x8F\x79\x77\x85\xD5\x83\x3B\x89\xA1\x89\x60\x84\xA3\x89\x7F\x8A\xCC\x5E\x8C\x01\xD4\x89\xB9\x63\x07\x8A\x63\x86\xD8\x89\xAD\x8A\x87\x8A\xAF\x8A\xDC\x89\x61\x87\xDE\x89\x63\x87\xE0\x89\x65\x87\x14\x8A\x6D\x8A\x16\x8A\x6F\x8A\x93\x8A\x71\x8A\xBC\x89\x73\x8A\xBE\x89\xA9\x73\xC0\x89\x05\x79\x98\x85\x01\x01\x9A\x85\x6D\x7A\x2F\x8A\x3C\x89\xC7\x80\x31\x8A\xC7\x86\x03\x8A\x80\x8A\xA7\x89\x79\x80\x5E\x8A\x2C\x87\xAB\x8A\x3A\x8A\xE6\x7D\x3C\x8A\x02\x70\x65\x8A\xB0\x8A\x8F\x87\x41\x8A\xD6\x85\x6A\x8A\xC2\x75\x6C\x8A\xE3\x89\x6E\x8A\xE5\x89\x70\x8A\xE7\x89\x95\x8A\x1B\x8A\x97\x8A\x1D\x8A\x76\x8A\x1F\x8A\xEE\x89\x5C\x7A\xC4\x8A\x85\x88\xF4\x86\x44\x0F\x98\x80\xC2\x80\x45\x83\x83\x88\x7E\x8A\x89\x88\xA6\x8A\x8C\x88\xA8\x8A\x44\x89\x38\x8A\xFA\x8A\x61\x8A\xFC\x8A\x63\x8A\x0C\x8A\xAF\x89\x69\x86\x97\x88\x2D\x88\x99\x88\xB4\x89\x50\x89\xB6\x89\x52\x89\x66\x85\xFA\x85\x68\x85\xBB\x89\x57\x89\xC5\x88\x4D\x8A\x0F\x8B\x99\x8A\xFA\x85\x8F\x89\x56\x81\xB1\x6D\xE8\x85\x7C\x8A\x51\x01\x1C\x8B\xB8\x88\xD2\x89\xCF\x8A\x55\x88\x05\x8A\xF7\x8A\xA9\x8A\xF9\x8A\xED\x88\xFB\x8A\x1E\x7F\x5B\x87\x88\x8A\x0E\x8A\xDA\x8A\x10\x8A\xDC\x8A\x12\x8A\xDE\x8A\x8F\x8A\xE0\x8A\x91\x8A\xE2\x8A\x5B\x7F\x36\x88\xB6\x85\x8A\x89\xB8\x85\xA2\x83\xE3\x85\xA4\x83\x9B\x8A\x67\x89\x5F\x79\x0D\x86\x52\x87\xEF\x8A\xCB\x8A\x8C\x84\xE5\x88\xCE\x8A\xD2\x30\xD1\x8A\x87\x81\x23\x8B\x8C\x87\x20\x89\xD7\x8A\x1B\x85\xB1\x8A\xDB\x8A\xB3\x8A\xDD\x8A\x94\x87\xDF\x8A\x07\x8B\xE1\x8A\x09\x8B\xE3\x8A\x0B\x8B\xE5\x8A\x96\x8A\xE7\x8A\xC2\x75\xE9\x8A\x77\x8A\xA8\x84\xF7\x83\x14\x8B\x6E\x89\x35\x7A\x34\x86\x35\x81\xA6\x86\x57\x8A\xF0\x8A\xB4\x83\xF2\x8A\x1C\x88\xA5\x8A\xF5\x8A\x46\x8B\xEC\x80\xD3\x8A\x1E\x89\x6F\x8B\x62\x8A\x93\x88\x27\x8B\x95\x88\x29\x8B\xB1\x89\x2B\x8B\xB3\x89\x2F\x88\x28\x89\x31\x88\x07\x7F\x47\x8A\x86\x89\x49\x8A\xE3\x86\x4B\x8A\xC2\x75\x37\x8B\xBF\x8A\x1E\x8A\xC1\x8A\x51\x8A\x2F\x85\x16\x65\xE9\x85\x00\x00\xFF\x7B\x56\x8A\x6C\x89\x41\x8B\xD1\x89\x5A\x8A\x92\x8B\x5C\x8A\x47\x8B\x21\x8B\xAA\x8A\x4A\x8B\x24\x8B\x4C\x8B\x47\x89\x8D\x87\x00\x8B\x24\x89\xB2\x8A\x90\x86\xB4\x8A\xF8\x88\xB6\x8A\xFA\x88\xC4\x87\x48\x8A\x35\x88\x4A\x8A\x37\x88\x9B\x81\x39\x88\x6F\x88\x3B\x88\x07\x7F\x3B\x8B\x35\x79\x7E\x86\x9B\x10\x80\x86\x65\x8B\xCA\x8A\x42\x8B\x1D\x88\x69\x8B\x1D\x8B\xB9\x8B\xA7\x8A\xBB\x8B\x83\x8A\x45\x89\xBE\x8B\x97\x8B\x25\x8B\x99\x8B\xAE\x89\x9B\x8B\xBC\x87\xD9\x86\x7E\x89\x2F\x81\x80\x89\xC7\x8B\x82\x89\xF9\x88\x84\x89\xCB\x8B\xA5\x8B\xCD\x8B\xA7\x8B\xCF\x8B\x03\x85\xD1\x8B\xBF\x89\xD3\x8B\x7F\x89\xD5\x8B\xC5\x86\xBE\x85\xF3\x8A\xAE\x83\x34\x86\xA5\x86\x9F\x8A\xFD\x89\xB6\x8B\x02\x8A\x33\x8A\x44\x8B\x8B\x88\xFA\x82\x8D\x88\xE3\x8B\x22\x8B\xE5\x8B\xD5\x8A\x70\x8B\xCD\x85\x4E\x8B\x9C\x8B\x8A\x8A\x9E\x8B\x8C\x8A\x2D\x8B\x8E\x8A\x2F\x8B\x90\x8A\x31\x8B\xC5\x88\x33\x8B\x94\x8A\x7E\x8B\x0D\x8B\x80\x8B\x07\x7F\x82\x8B\x11\x8B\x78\x8A\xC3\x7F\x86\x8B\xCE\x89\xB4\x84\x37\x7A\x24\x87\xA7\x6E\xA9\x67\xA1\x8A\x4E\x87\x11\x86\xDE\x8B\xDC\x8B\x91\x8B\x0A\x8C\x6C\x8B\x37\x85\xD4\x8A\x09\x8A\xC0\x88\x49\x89\xEA\x8B\x62\x85\x07\x83\x64\x85\xE9\x7F\x55\x7E\x59\x8B\xCE\x8B\x5B\x8B\xD0\x8B\x8B\x89\x3A\x88\x8D\x89\x3A\x8B\x61\x8B\xA1\x6C\xF9\x87\x48\x87\x88\x8B\x0C\x6E\xA8\x04\x0E\x6E\xC7\x89\x8E\x82\xF5\x86\xFB\x89\x99\x7F\xA0\x8A\x07\x8C\x32\x8A\x43\x8B\x6B\x8B\x35\x8A\xBC\x88\xF8\x8A\x26\x88\xE6\x8B\xC0\x8B\xAC\x8A\x22\x89\xC3\x8B\x40\x8A\xC5\x8B\x26\x89\x43\x8A\xA1\x8B\x45\x8A\xC5\x88\xA4\x8B\x67\x85\xCF\x88\x7F", "\x89\x89\x89\x46\x8C\x5D\x8B\x8C\x89\x5F\x8B\x1E\x84\x4B\x8C\x1B\x6E\xED\x87\x5E\x86\x57\x1C\x1B\x65\x21\x6E\x30\x0C\x37\x19\x8B\x01\x0E\x89\x22\x87\x3C\x0F\x30\x82\xCA\x86\x1D\x65\x6B\x89\x3F\x76\x8D\x8B\xD4\x81\x8F\x8B\xC5\x8A\xF4\x8A\x36\x8C\x5D\x8C\xD5\x89\x5F\x8C\xAA\x89\x64\x8A\x0A\x8A\x3C\x8C\x7B\x89\x66\x8A\xEC\x8B\x68\x8A\xBF\x87\x04\x8B\x07\x7F\x06\x8B\xB7\x8A\x08\x8B\xB9\x8A\xE6\x89\xBB\x8A\x1A\x8A\xBD\x8A\x1C\x8A\xAB\x8B\x10\x8B\xAD\x8B\x12\x8B\x46\x87\x85\x82\x5E\x7B\xAF\x88\x7B\x8C\x1A\x65\xC8\x7A\x52\x15\xBC\x82\xC6\x85\xD8\x77\x50\x87\x56\x8C\x97\x89\x06\x8C\x89\x8C\x5C\x0A\x8B\x8C\x15\x8B\x8D\x8C\x5C\x8C\x81\x8A\x36\x8A\x48\x8B\x60\x8C\x11\x8C\x98\x8B\x0B\x8A\xE9\x8B\x96\x8C\x65\x8C\x67\x8A\x02\x8B\xFA\x85\xC9\x88\xF1\x8B\xC9\x8B\xF3\x8B\xB8\x8A\xCC\x8B\xBA\x8A\x5A\x8B\x99\x86\x5C\x8B\x9B\x86\x5E\x8B\x9D\x86\x60\x8B\xE5\x85\x92\x7F\xD5\x87\x86\x82\x21\x87\x7E\x83\x26\x8A\x39\x6F\x8C\x82\x53\x8C\x2B\x8C\x9B\x10\x7F\x87\x85\x8C\x1C\x65\x87\x8C\xE2\x88\x67\x8B\x32\x8C\x16\x89\x6A\x8B\x17\x53\x37\x8C\x62\x86\x96\x8B\xC3\x8C\xE7\x8B\xC5\x8C\x3D\x8A\xF6\x85\x97\x8C\xC5\x88\xF5\x88\xC6\x8B\x76\x8B\xB5\x8A\x78\x8B\x9E\x8C\x7A\x8B\xA0\x8C\x0A\x8B\xA2\x8C\x0C\x8B\xA4\x8C\x0E\x8B\xA6\x8C\x39\x8B\xC5\x88\xFE\x8B\xA2\x87\x47\x87\x31\x8C\x62\x7A\x01\x82\xCC\x09\x2A\x7B\xE3\x8C\x16\x8B\x9B\x10\xAE\x87\x35\x65\xB5\x07\x8C\x8B\xEB\x8C\x3B\x86\x33\x8C\xB7\x8B\x35\x8C\xBE\x8C\xF6\x8A\x94\x8B\x91\x8C\xD7\x89\x3A\x8C\x78\x89\x95\x8C\xFF\x8A\xD9\x8A\x73\x8B\x51\x8B\x75\x8B\x53\x8B\x77\x8B\x55\x8B\x79\x8B\x57\x8B\x7B\x8B\x43\x8C\xF7\x8B\x45\x8C\xF9\x8B\x47\x8C\xD2\x8B\x49\x8C\x09\x8D\x77\x8C\x8A\x79\x00\x8C\x90\x8B\x57\x1C\xDC\x8C\xAC\x8C\x97\x7C\x45\x75\xDA\x87\xEE\x8A\xCC\x09\xD9\x09\x4F\x24\x2C\x82\xF0\x82\xE1\x87\xF2\x87\x3A\x7E\xAC\x72\x79\x74\x5C\x0A\x23\x80\x8C\x8C\x02\x8C\x9F\x7A\x7F\x74\x62\x7E\x2D\x65\xA2\x73\x09\x72\x70\x80\x10\x70\x61\x7D\x71\x6D\x4F\x8D\xBC\x8C\x02\x8C\x8C\x74\xF5\x6A\xFC\x73\xFB\x69\x5C\x8D\x87\x8B\x9E\x7F\x99\x7B\x94\x74\xB8\x0E\x23\x70\xC0\x74\x25\x70\x07\x75\x56\x8D\xB5\x74\x44\x0F\xFD\x71\x6F\x71\xCB\x69\x63\x8D\x2A\x8C\x65\x8D\x73\x71\xCF\x33\xA6\x74\x14\x75\x2F\x6B\x74\x72\xE1\x74\x2B\x71\xD6\x74\xA8\x70\x31\x85\x34\x8C\x57\x1C\x66\x8D\xBF\x69\x43\x70\xB8\x6A\x79\x8D\x56\x70\x2A\x72\x17\x75\x97\x71\x8D\x63\x1D\x72\x71\x8D\xA9\x67\x73\x8D\xFF\x89\x1B\x78\x83\x8D\x25\x72\xC7\x6A\x45\x8B\x57\x8D\x06\x75\xF8\x71\x19\x72\x76\x83\x9C\x74\xC5\x74\x0B\x75\xCC\x69\x90\x8D\xA2\x8A\x92\x8D\x13\x71\xCE\x74\x8B\x88\x07\x70\x24\x80\x99\x8D\x64\x72\x9B\x8D\x18\x75\xFF\x00\x56\x71\xFF\x71\x62\x8D\xD7\x83\x93\x8D\xD4\x81\xC0\x05\x3B\x6E\xF9\x74\x6D\x8D\xD4\x74\xA0\x65\x9E\x8D\x4E\x8D\xB0\x8D\x76\x8D\xD2\x52\x52\x72\xB5\x8D\x01\x71\xDE\x68\x6D\x71\xB9\x8D\x7B\x8A\x89\x8C\xB1\x8D\xF7\x74\xBF\x8D\xA4\x70\xFC\x74\x7E\x8D\x21\x75\x5B\x8D\xBB\x8D\xF5\x81\x2C\x6A\x46\x01\xC8\x8D\x5F\x71\x8D\x63\x8B\x71\x15\x7C\x9F\x8D\xCE\x8D\xA3\x74\x3A\x6A\x12\x75\x92\x71\xEA\x74\x46\x70\xEC\x74\xFB\x74\x8E\x10\x1A\x75\x1C\x7D\xBA\x8D\x89\x8C\x37\x89\x8E\x10\xA1\x71\xA4\x7D\x0A\x89\x42\x6A\xA0\x8D\x0D\x8D\x1B\x87\x8F\x79\x27\x75\x11\x70\x8F\x8D\xD7\x83\x74\x6B\xCA\x70\x2D\x75\x61\x8D\xD7\x8D\x89\x8C\x4D\x8C\x6F\x74\x6B\x6C\x36\x75\xB6\x8D\xA6\x8D\x0F\x7D\x85\x74\xC1\x66\xF1\x87\x81\x6B\x10\x89\x06\x01\x8D\x00\x29\x7D\x1A\x65\xB2\x5A\x20\x1C\xF1\x2F\x29\x8A\x25\x8A\x03\x8E\x97\x7D\xE5\x71\x09\x01\xB3\x3B\x0F\x8E\x96\x72\x11\x8E\x06\x01\x8F\x00\x14\x8E\x19\x8E\xE1\x7E\x2C\x8C\x4C\x6D\xF1\x8D\x4D\x74\x10\x75\x94\x6F\xED\x8D\xA7\x87\x8F\x79\x40\x10\x90\x00\xFE\x87\xA7\x72\x09\x01\x91\x00\xBE\x70\x8E\x6D\x82\x73\x0B\x79\x4A\x87\x7D\x6E\x22\x30\xE9\x8D\x08\x8C\x66\x7E\x1A\x8E\xAF\x6B\x15\x7D\x92\x00\x08\x8E\x81\x84\x26\x69\x64\x53\x20\x87\x48\x8D\x41\x88\x35\x8E\x70\x80\x81\x6F\xE3\x8D\xE1\x79\x16\x8D\xDF\x87\x7C\x67\x84\x63\x05\x8E\xC8\x42\x40\x8E\x32\x7D\x4B\x8D\x02\x70\x4D\x8D\x84\x6D\x45\x8E\x41\x8D\xE0\x3A\xDB\x87\x0C\x05\x7A\x83\xDF\x8D\xD0\x71\xA6\x80\xFF\x00\x59\x8D\x83\x6F\xE6\x65\xB6\x73\x42\x63\x3E\x8E\x47\x6D\x5F\x8D\x7C\x71\x1C\x71\x5D\x8E\x51\x8E\x30\x8E\xE0\x3A\xB1\x8D\x14\x71\x41\x65\x87\x8D\x93\x70\x7B\x8D\x5D\x74\x9F", "\x7F\x48\x0F\x70\x8D\x90\x7C\x4A\x80\xF2\x7C\x40\x8D\xEE\x5E\xE0\x87\xC0\x0B\xF5\x81\x23\x71\xD2\x8D\x75\x72\xAA\x74\xC3\x8D\x70\x78\x75\x8E\xBF\x7C\x69\x7B\x57\x84\xB1\x8D\x9C\x7B\xDF\x03\x7C\x8E\x7C\x8D\xB6\x74\xF6\x8D\x8C\x70\x42\x6A\x5E\x8E\x47\x0F\x60\x8E\x99\x0B\x20\x70\xBF\x74\x05\x75\xC1\x74\x38\x72\xA8\x74\x18\x69\x2D\x72\x8B\x8E\x8E\x74\x71\x6D\x8E\x8E\x43\x0F\x90\x8E\x69\x8E\xA4\x8D\x88\x8E\x6F\x8E\xEB\x69\x7F\x8E\x5A\x28\x66\x8E\xD9\x87\x68\x8E\x20\x70\x44\x72\xDD\x8D\xC2\x74\x97\x8E\x2A\x69\x06\x69\xA5\x8E\x74\x8E\x85\x7C\xA8\x8E\xF2\x5E\xC6\x8D\xE8\x74\x12\x69\x6C\x8E\xE0\x74\xA3\x8E\x04\x6B\x9A\x8E\x64\x8E\xB9\x69\x9D\x8E\x3F\x0F\x9F\x8E\xBC\x8D\x5E\x66\x0D\x6B\x6A\x8D\xA1\x70\x73\x72\x6B\x71\x89\x8E\x67\x72\xB1\x8E\x53\x85\xB3\x8E\xF3\x7C\x22\x30\xA0\x8E\x6F\x72\xD1\x8D\xB9\x8E\x89\x8D\xAA\x8D\x8B\x8D\x8E\x10\xD5\x8D\x6A\x7C\x50\x8E\x81\x8E\x05\x7D\xD0\x8E\xA3\x8D\xA9\x0B\x4A\x69\xAC\x8E\x96\x8E\x57\x8E\x66\x72\x83\x72\xE6\x65\xEB\x87\x5C\x0A\xC0\x8E\x3B\x0F\x90\x8E\xE6\x8D\x71\x0F\xE8\x8D\x43\x8E\x80\x8E\xCE\x8E\x76\x8E\x61\x7B\x6B\x7B\xC3\x70\x68\x69\xE8\x8E\xDB\x8E\xF2\x8E\x82\x8E\x77\x8E\x47\x8E\x49\x8D\x36\x8E\xF3\x87\xBD\x8E\xD1\x6A\x65\x8E\xDC\x8E\x1F\x32\x78\x8E\x20\x01\xFA\x8D\x33\x75\x50\x8D\xC7\x0C\xFA\x81\x9E\x15\xFE\x8D\x09\x71\xA5\x72\x1A\x7D\x09\x01\x94\x00\x4B\x8E\x1B\x8E\x9B\x10\xD9\x7D\xDA\x8E\x4B\x88\x64\x7F\x5D\x84\xFD\x7D\x06\x7F\x7F\x89\xC4\x7F\x43\x0F\x03\x7E\xC5\x45\x05\x7E\xB2\x8D\x41\x78\x24\x83\x19\x8F\x18\x8F\xF5\x6C\x23\x6D\x5D\x89\x02\x01\x5F\x89\x9F\x63\x75\x88\x09\x7F\x25\x84\xAA\x6C\x7B\x88\xB4\x83\x4F\x83\x23\x7C\x4D\x8E\xB1\x6C\x73\x8E\x72\x0B\x5B\x6E\xA9\x8C\xD8\x88\xAA\x88\x2B\x56\xEE\x04\x7A\x83\x81\x8C\xDF\x8C\x34\x86\xB2\x88\xAE\x8D\xCC\x69\x18\x88\x71\x85\xDA\x8C\x1E\x8F\xD9\x88\x1D\x8E\xDB\x88\xD5\x6C\x20\x87\x16\x6D\xDF\x88\x7D\x8A\xB5\x6D\x27\x8F\xCA\x81\x9F\x86\xC5\x88\x0A\x85\x15\x7D\x94\x82\xED\x71\x17\x8F\x56\x8F\x05\x89\x7D\x86\x15\x8F\x48\x0F\x39\x89\xD6\x8D\x5D\x8F\xC3\x89\x1A\x8B\x1C\x8F\xC1\x75\x42\x88\x76\x88\x90\x68\x3C\x01\x0B\x7F\xEB\x76\x9B\x10\x2B\x84\x09\x89\x7C\x72\x71\x6D\x48\x8F\x35\x79\x39\x8D\x0F\x6D\xF0\x89\x75\x87\x02\x75\xB5\x05\x53\x84\x14\x88\x55\x84\xF6\x89\x24\x77\x12\x8D\xAC\x87\x29\x77\xB6\x8C\xB2\x71\x42\x6A\x75\x8F\xFF\x8B\x57\x8F\x85\x75\xC4\x89\x58\x77\xC6\x89\x0D\x8E\x54\x8C\x44\x0F\x87\x84\x2C\x84\x00\x6E\xE6\x65\x88\x8F\xC3\x8A\x4A\x8F\xEE\x8B\x1F\x8F\x43\x84\x95\x7F\xA9\x0B\x41\x6D\xF4\x89\xD3\x77\x80\x8F\x98\x77\x8F\x8F\xE4\x8C\x48\x0F\xB6\x84\x93\x8F\x58\x6E\xA9\x67\x96\x8F\x30\x86\x98\x8F\x61\x89\x08\x7F\x94\x7F\xC7\x7F\x8C\x17\x55\x30\xDE\x84\x0E\x8E\x7F\x8F\x31\x3F\xE2\x84\xAC\x83\x85\x84\x8D\x63\xE7\x84\x2D\x8A\x03\x70\x95\x8F\x3B\x8F\x27\x8C\xD8\x88\x53\x8A\x6F\x6D\x54\x8F\x29\x8F\x71\x6E\x3C\x8F\x58\x86\x7A\x8A\x80\x8D\x56\x74\x87\x8F\xBF\x8F\x84\x8B\xA0\x86\x52\x85\x9E\x8A\x46\x8F\x65\x8F\x13\x8B\xAC\x8F\x9B\x8D\xD1\x87\x3B\x8D\x0A\x8F\x43\x8F\x91\x6D\x27\x01\x73\x80\x5C\x8E\xB9\x69\xAA\x8F\xF7\x83\xEB\x8A\x00\x00\xED\x8A\x8C\x8E\x74\x8F\xCD\x8F\x08\x7A\x29\x8C\x91\x8D\xA4\x8F\x8D\x63\x18\x8B\xF6\x87\x55\x8F\xA1\x81\x8A\x8F\xE6\x85\x3D\x8B\xB3\x6D\xEE\x8F\xC5\x8F\xB6\x79\x77\x8F\x23\x83\x3C\x0F\x0A\x81\x0C\x81\xEC\x7C\x47\x8F\xE7\x8F\xC6\x8F\x48\x6C\x19\x8D\x1B\x87\xCB\x6D\x36\x86\xF5\x8F\x03\x01\xE0\x8F\xA0\x86\xF8\x8F\x6E\x78\xB0\x8B\x58\x81\xC4\x8F\x07\x90\xFF\x8F\xB6\x79\xD7\x8B\x48\x0F\xD9\x8B\x28\x8F\x0F\x90\x00\x90\xCE\x8F\x58\x8F\xE9\x8F\xA1\x8D\x4F\x8C\xA4\x86\x0E\x7A\x39\x8F\xB0\x76\x17\x90\xE8\x8F\xD8\x8F\x5D\x8D\x82\x8C\x1C\x8E\x80\x87\xD2\x7C\xEF\x8F\xD4\x8F\xF1\x8F\xDB\x8C\x79\x8C\xAD\x8C\xB8\x82\x50\x8C\xC0\x0C\x65\x7A\x3B\x73\x7B\x85\x2B\x69\xF6\x86\x4D\x6D\xA9\x8F\x10\x90\xC1\x7A\x08\x8F\xA6\x87\x58\x82\x28\x82\xF1\x0E\x1E\x87\x80\x8C\x82\x8F\x0F\x89\x23\x87\x1D\x8E\x94\x8F\xDF\x8F\x39\x90\x24\x82\xAB\x8C\xD7\x87\x7A\x8C\x2F\x90\x2F\x8E\x7C\x6E\x4C\x87\x70\x7D\xB3\x8C\x5F\x6D\x40\x6E\x85\x8F\xF7\x70\xFB\x69\x08\x90\x19\x90\xD5\x8F\xD0\x87\xD0\x7D\x0C\x8D\x77\x87\xE0\x8C\x6A\x6F\x6C\x0A\x7A\x87\x42\x8F\x6C\x6C\x7E\x87\x55\x90\x44\x6B\xE6\x8F\x21\x90\xC3\x7D\x5D\x90\x3C\x90\x27\x7B\x43\x8D\x80\x53\x11", "\x8D\xA3\x8F\x13\x8D\x48\x0F\x15\x8D\x31\x69\x16\x90\xF7\x8F\x5A\x90\x54\x59\x1A\x90\x22\x8E\x78\x6E\x4A\x90\x76\x87\x0B\x74\xCF\x8E\x53\x8E\x6E\x90\xB8\x54\x45\x8D\x66\x7B\x7F\x90\xF3\x8E\x42\x8D\x59\x8E\x01\x0B\xB8\x7D\x6B\x8F\x1C\x65\xB2\x5A\xAC\x31\xA7\x22\x1C\x5F\xFE\x8E\x2F\x8F\x42\x63\xAC\x73\x8D\x09\xAE\x73\x62\x72\xE5\x6C\x36\x8F\x9B\x10\x7F\x69\x0E\x90\x9E\x78\xA9\x88\x52\x8D\x80\x53\xAC\x88\xAE\x8E\xC0\x74\x49\x8E\xC5\x7D\x5A\x8D\xFB\x69\xDD\x8F\xA6\x83\x62\x8E\xD5\x73\xFE\x7C\xCC\x69\xA9\x90\x90\x89\xDF\x8E\x6D\x0C\x69\x8D\x94\x8E\x6B\x8D\xA8\x8D\xC3\x74\x98\x8E\x6F\x8D\xCC\x8E\x01\x01\xAF\x90\x09\x79\xB6\x8E\x77\x8D\xAE\x68\xA9\x6A\xD4\x8E\x16\x75\xD6\x8E\x88\x70\xB5\x69\xBA\x90\xF8\x0B\x23\x6D\x85\x8E\x85\x8D\x33\x71\xC2\x90\x6E\x8E\x8A\x8D\xC5\x90\x8C\x8D\xC7\x90\xBC\x90\x21\x8A\xF5\x81\x93\x8E\x97\x8D\x95\x8E\x6C\x8D\xC0\x8D\xF2\x68\x44\x71\xD2\x90\xC9\x90\xB1\x90\x0B\x0D\xD8\x6A\xC6\x8E\x9A\x6A\xC8\x8E\xF9\x71\xCF\x90\x70\x8E\x8D\x63\xAD\x8D\x1F\x72\x71\x6D\xD3\x90\x09\x85\xB1\x8D\xAB\x8E\xE2\x90\x28\x72\xDF\x74\xD5\x8E\x9B\x74\xAB\x8D\x4B\x72\x64\x8F\xDC\x8F\xDE\x90\x7A\x8E\xB7\x8E\x24\x8F\x58\x8E\x55\x72\xB6\x90\xA3\x90\xC1\x8D\x5A\x72\xDD\x90\x8F\x77\xC3\x8E\xB2\x66\xC5\x8E\xB4\x90\xC7\x8E\xF2\x90\xC3\x90\xF4\x90\xD7\x8E\x71\x0F\x68\x72\x8E\x8D\xE6\x65\xEC\x90\xF3\x81\xD1\x8E\x9E\x70\x70\x72\xF0\x90\x72\x72\x0A\x91\xCE\x90\xC4\x90\xE7\x90\xD8\x8E\x03\x91\xB6\x79\x14\x91\x0B\x0D\xE1\x8E\x17\x91\x14\x69\xFF\x90\xE4\x8E\x9C\x8D\x8D\x63\xE2\x8D\x3F\x75\x5C\x0A\x12\x91\xE3\x82\xED\x8E\xFF\x00\xEF\x8E\x2A\x91\xF8\x90\x8E\x7E\xF6\x8E\xDA\x74\x1C\x65\x12\x70\x9E\x90\x66\x8F\x71\x74\xC9\x86\x63\x8E\x02\x8F\xB9\x69\x2C\x91\xF7\x83\x3B\x90\x53\x74\x01\x8C\x0B\x8F\xBB\x71\x26\x91\x7D\x74\x16\x88\xF6\x8F\x26\x83\x42\x6A\x8A\x6E\xEC\x7B\xB2\x71\xD8\x1C\xF0\x8C\xA9\x89\x22\x8D\x93\x8C\x3B\x8C\xAE\x8A\x72\x8B\x01\x8B\x67\x8C\x42\x8A\xF0\x8B\x44\x8A\x83\x89\x70\x86\xCD\x88\x6E\x8C\x87\x89\x49\x85\xA8\x8B\x07\x7F\xAA\x8B\xD7\x8C\x03\x89\xA4\x83\x2B\x8F\x19\x83\x1D\x8F\x99\x8F\x43\x88\x77\x88\x45\x88\x22\x8F\x47\x88\x3D\x89\xC5\x6D\x4A\x88\x49\x91\x63\x79\xA9\x67\x4C\x91\xFD\x8F\xF4\x0A\x4F\x91\x8F\x8C\xD2\x8A\x21\x8D\x08\x8A\x53\x91\x24\x8D\x55\x91\xF3\x88\xC2\x75\xFA\x8C\x68\x8C\x5A\x91\x6A\x8C\x5C\x91\x46\x8A\x71\x86\xA9\x73\x1F\x8C\xE4\x8A\x35\x8B\x4C\x8A\xFA\x8B\xE8\x8A\xFC\x8B\xEE\x8B\x3D\x88\x00\x09\x8C\x0E\x2D\x8F\x31\x7E\x30\x8F\x44\x88\x32\x8F\xAC\x6C\x7C\x88\xF3\x24\x39\x7E\x9B\x90\x27\x01\x81\x88\x75\x91\xE6\x65\x77\x91\xAD\x90\x79\x91\xDE\x3E\x7B\x91\x6D\x8B\x10\x8C\x23\x8D\x86\x8A\x13\x8C\xD8\x8A\x89\x8A\x50\x8B\x8B\x8A\x52\x8B\x8D\x8A\x54\x8B\x1B\x8C\x56\x8B\x1D\x8C\x8B\x91\x6F\x8C\xEE\x8B\x71\x8C\x34\x8D\x73\x8C\x48\x8C\x75\x8C\x9A\x8A\x78\x90\x99\x90\x19\x65\x61\x7E\x0C\x0E\x80\x68\x63\x90\xAE\x8C\x44\x8F\x0F\x86\xF4\x82\xA4\x91\xAC\x74\xA7\x91\xDB\x45\x1F\x8D\x06\x82\x7D\x91\x39\x8C\x7F\x91\xAD\x91\x00\x87\xAF\x91\x4F\x8B\x28\x8D\xB2\x91\x2A\x8D\xB4\x91\x2C\x8D\xB6\x91\x2E\x8D\xB8\x91\xC2\x75\x8C\x91\x7D\x8B\x8E\x91\xA9\x8B\x90\x91\x81\x8B\x92\x91\xAD\x8F\x0A\x8D\x2D\x91\xA7\x83\xDA\x88\xA9\x83\x39\x76\x42\x90\x34\x8E\x52\x8F\x40\x8B\xC9\x8A\x71\x6D\xA5\x91\xF7\x8D\xCF\x91\x50\x91\x95\x8B\x60\x8A\x61\x8C\x7F\x80\xFE\x8A\x3E\x8A\xC8\x8C\x98\x8C\xCA\x8C\xC5\x88\xCC\x8C\x5B\x91\xF2\x8B\x5D\x91\x85\x89\x5F\x91\xA6\x8B\xFE\x88\x62\x91\x7F\x89\x64\x91\x74\x8C\xD8\x8C\x76\x8C\xC2\x91\xA1\x6C\xBE\x7E\x13\x7F\x5B\x86\x56\x70\xCE\x91\xCA\x14\xA8\x91\xBF\x8C\x5E\x8C\xC1\x8C\x92\x8C\x9A\x8B\x41\x86\x26\x8B\xC6\x8C\x26\x8D\xB0\x91\xDA\x91\x17\x8C\xB3\x91\x19\x8C\xB5\x91\x6F\x86\x89\x91\x5E\x91\x32\x8B\xBA\x91\xAD\x8F\xBC\x91\x58\x89\xE7\x91\x24\x8C\xE9\x91\xD6\x8F\x94\x78\x13\x92\xCC\x6C\x2E\x91\x63\x8F\xCC\x91\xB9\x69\xF7\x91\xE5\x8F\x63\x71\x94\x16\x1B\x92\xD1\x91\x8E\x84\x51\x91\x7E\x91\x20\x92\xAC\x89\x22\x92\xF6\x8C\xC3\x88\xF8\x8C\x7D\x89\x99\x8C\xC8\x88\x9B\x8C\x7F\x89\x9D\x8C\xCA\x8B\xD0\x8C\xF5\x8B\xD2\x8C\x44\x8C\xD4\x8C\x72\x8C\xD6\x8C\x10\x92\x66\x91\x1E\x84\x68\x91\x05\x7F\x69\x8F\x1E\x8F\x6C\x91\x6C\x8F\x26\x84\x63\x73\x28\x84\x76\x6D\x2A\x84\x66\x90\x9F\x89\x39\x0C\x19\x92\x41\x92\xD0\x91\x93\x8B\xD2", "\x91\x1E\x92\x52\x91\x47\x92\x94\x8C\x81\x91\x7C\x89\x83\x91\xED\x8B\xAD\x8F\x05\x92\x87\x91\x07\x92\x2C\x92\x09\x92\x2E\x92\x60\x91\x75\x86\x0D\x92\xEE\x8B\x0F\x92\xBF\x91\x11\x92\xC1\x91\x2B\x90\x61\x92\x47\x87\x94\x89\x96\x89\xA4\x72\x98\x89\xF7\x89\x50\x8F\xF9\x89\x44\x0F\x5B\x84\x3F\x8B\x52\x0C\x6C\x92\x8D\x17\x42\x92\x6F\x92\x44\x92\xFB\x91\x6E\x8B\xF3\x8C\x62\x8C\xFB\x8A\x56\x91\xC4\x8B\x74\x8B\xFB\x8C\x2B\x8D\xFD\x8C\x2D\x8D\xFF\x8C\x2F\x8D\x01\x8D\x7C\x8B\x03\x8D\x21\x8C\x05\x8D\x23\x8C\x7F\x89\x25\x8C\xA8\x8C\xC0\x8F\xD6\x8B\xA7\x8D\x26\x69\x83\x84\x90\x92\x2A\x8A\x91\x8F\x69\x92\x76\x91\x96\x92\x7A\x91\x1C\x92\x90\x8C\x71\x92\x46\x92\x23\x92\x74\x92\x71\x8B\x82\x91\x07\x7F\x84\x91\x59\x91\xFC\x8C\xC8\x8B\xFE\x8C\x53\x92\x9F\x8C\xD1\x8C\xA1\x8C\xD3\x8C\xBC\x8A\xD5\x8C\x01\x89\x65\x91\xC0\x8A\xD9\x8C\x88\x92\x6B\x91\x8A\x92\xAD\x84\x8C\x92\x60\x90\x27\x8A\x8F\x92\xB8\x8F\x91\x92\xA0\x7F\xBA\x92\xCD\x91\xD6\x8D\xF9\x91\xA9\x91\x38\x8C\xF2\x8C\xAC\x91\xD6\x8A\xAE\x91\xA0\x92\x66\x8C\xA2\x92\x85\x91\xC9\x92\xCD\x8C\xCB\x92\xCF\x8C\xCD\x92\x55\x92\xCF\x92\x57\x92\xD1\x92\x59\x92\xD3\x92\x5B\x92\xD5\x92\x12\x92\xD7\x92\xAD\x8F\x9A\x8F\x1D\x86\x56\x6D\xC8\x7F\xD1\x77\x9F\x8F\x6A\x89\xA1\x8F\x6A\x7B\x3F\x8E\x4C\x90\x53\x90\x44\x0F\xBB\x8F\x17\x92\x95\x92\xE4\x92\x1A\x92\x6E\x92\xBA\x8B\x20\x8D\xC0\x92\xD4\x91\x73\x92\x54\x91\xC4\x92\x76\x92\xC6\x92\x78\x92\x36\x92\xEF\x8B\xF0\x92\x06\x92\xCE\x8C\x08\x92\xF4\x8B\x0A\x92\xF6\x8B\x0C\x92\xF8\x8B\x32\x92\x35\x8D\xFB\x8B\x37\x8D\xCE\x87\x38\x92\x8C\x6C\xC2\x8F\x15\x78\x0E\x93\x3E\x92\x9B\x8E\x40\x92\x97\x92\x12\x93\xE1\x8B\x14\x93\xBC\x8B\x49\x8B\x85\x8A\xEA\x92\xD7\x91\xEC\x92\xC9\x8C\x58\x91\x03\x8B\x27\x89\xC5\x88\x52\x92\xF3\x92\x00\x8D\xCE\x92\x02\x8D\xD0\x92\xA3\x8C\xD2\x92\xBE\x8A\xD4\x92\xAC\x8B\xD6\x92\x5F\x8F\xCF\x8F\xC9\x8F\xCC\x73\x32\x85\xE3\x92\x46\x7C\xE5\x92\xBE\x92\x7C\x91\x15\x93\xE8\x92\xD5\x91\x3C\x93\x4D\x8B\xD8\x91\x15\x8C\xB1\x91\x27\x92\xDC\x91\x29\x92\xDE\x91\x2B\x92\x6C\x8C\x8A\x91\xE2\x91\x2F\x92\x1D\x93\x31\x92\x36\x8B\x33\x92\xAF\x92\x35\x92\x5B\x90\xE2\x2E\x0A\x90\x72\x91\x9D\x8A\x73\x4B\x8B\x8B\x27\x01\x32\x93\xBE\x8E\xC0\x72\x98\x92\x13\x93\x70\x92\x39\x93\xC2\x8C\xE9\x92\x12\x8C\x3D\x93\xC5\x92\x7F\x89\xC7\x92\x41\x93\x69\x8C\x43\x93\xA2\x8B\x7F\x89\x6D\x8C\x7F\x92\x0B\x92\x88\x89\x82\x92\xAD\x8F\x84\x92\x36\x8D\xC0\x91\x4A\x8C\x2D\x93\x97\x78\x31\x81\xE5\x8D\x34\x86\xC8\x8A\x00\x7D\x5C\x0A\x79\x93\x3D\x91\x7B\x93\x36\x93\x1F\x8B\xE2\x8B\x13\x85\x84\x8A\xAE\x8A\x9E\x92\x24\x8B\x3E\x93\x02\x92\x40\x93\xCB\x8C\x50\x92\xEE\x8B\x44\x93\x22\x93\x54\x92\x24\x93\x56\x92\x32\x8D\x58\x92\xBD\x91\x5A\x92\x85\x92\x5C\x92\x8E\x89\xE2\x8F\xE4\x8F\x82\x75\x55\x93\x46\x8F\x57\x93\x43\x92\xEF\x85\x45\x92\x16\x93\xC2\x92\x18\x93\xEB\x92\x84\x93\xEE\x8B\x86\x93\xAC\x93\x42\x93\x6B\x8A\x8A\x93\xEE\x8B\x8C\x93\x1E\x8C\x6A\x93\x71\x93\x6C\x93\x8F\x91\x29\x93\x91\x91\x2B\x93\x3C\x88\x73\x93\xF6\x6D\xA2\x6D\x89\x8C\xC1\x85\xA7\x6D\x31\x93\xBC\x92\x7C\x93\x37\x93\x7E\x93\x0E\x8C\xBD\x8B\x3B\x93\x82\x93\x5E\x93\xA9\x93\xF9\x8C\x1C\x93\x71\x93\x7A\x92\x89\x93\x6B\x8C\x73\x84\x68\x93\x07\x7F\xE3\x91\xAB\x92\xE5\x91\x63\x91\x6E\x93\xEE\x8B\xB0\x92\x4F\x93\xC2\x8A\x06\x89\xF3\x8F\x39\x79\xE0\x93\x10\x93\x6D\x92\xFA\x91\xD3\x91\x5B\x93\x17\x93\x80\x91\x19\x93\x4C\x92\x77\x92\x4E\x92\x7F\x89\xEE\x93\xCD\x93\xF0\x93\x32\x88\xF2\x93\x7F\x89\xF4\x93\x49\x93\x04\x8D\x4B\x93\xA5\x8C\x4D\x93\xA7\x8C\xFB\x93\xAE\x8B\xFD\x93\xFA\x8F\x64\x8B\x3C\x92\x4B\x91\xE1\x93\xA1\x93\x0C\x8C\x20\x8B\xE5\x93\x3A\x93\xA6\x93\xFE\x91\x64\x73\xC7\x8C\x27\x8D\x57\x91\xEE\x92\xC8\x92\xA4\x92\xCA\x92\xA6\x92\xCC\x92\x46\x93\xF5\x92\x48\x93\xF7\x92\x4A\x93\xF9\x92\x4C\x93\xFB\x92\x4E\x93\xFD\x92\x50\x93\x59\x90\x98\x93\x02\x90\x94\x7A\x04\x90\x4C\x4B\x00\x94\x56\x93\x11\x93\x03\x94\x5A\x93\xFC\x91\x9D\x92\x28\x94\x95\x73\x00\x92\x2B\x94\xA1\x92\x29\x8D\xA3\x92\xDD\x91\xA5\x92\xDF\x91\xA7\x92\xE1\x91\xF3\x93\xD2\x93\x95\x59\x90\x93\x1D\x93\x92\x93\x2A\x93\x94\x93\x38\x8D\x96\x93\xF9\x8F\x44\x0F\xB1\x8B\xB3\x8B\xB4\x92\xCC\x69\x9E\x93\x2F\x72\x2D\x71\xBD\x92\xC1\x93\x13\x86\x04\x94\x49\x94\x81\x93\xC4", "\x8C\x25\x8D\x4D\x94\x25\x92\x2C\x94\x50\x94\xEF\x92\x2F\x94\xF1\x92\x31\x94\x45\x93\xA8\x92\x47\x93\xAA\x92\x14\x94\xAC\x92\x16\x94\x06\x8D\x18\x94\x08\x8D\x2C\x93\xFE\x92\x1D\x93\xF8\x83\x1E\x65\xE0\x79\x55\x34\x94\x92\x67\x94\xB8\x74\x63\x73\x6A\x94\x99\x92\xC2\x93\x9B\x92\xAB\x91\x5C\x93\xE8\x93\xC1\x8B\x64\x8C\x4E\x94\xED\x92\x75\x94\x2E\x94\x52\x94\x30\x94\x54\x94\x32\x94\x7B\x94\x34\x94\x7D\x94\x36\x94\x15\x94\x38\x94\x17\x94\x3A\x94\x19\x94\x3C\x94\xFC\x93\x85\x8B\x23\x90\x64\x8D\x33\x86\x03\x8C\x1E\x90\x77\x93\x95\x24\x21\x94\x47\x94\x7F\x93\x1F\x92\xC5\x93\x07\x94\xC7\x93\x1A\x93\x85\x93\xEC\x93\x19\x51\xAD\x93\xAD\x8F\xAF\x93\x7D\x92\x23\x93\x8D\x93\x25\x93\x8F\x93\x27\x93\x6D\x93\xD6\x93\xE8\x91\xD8\x93\xD4\x8B\xDA\x93\xAC\x6D\xAC\x94\x74\x8D\x83\x8F\x26\x90\xE7\x8C\x81\x87\x78\x93\xB3\x94\xE6\x92\xF1\x8C\x6E\x94\x94\x94\x70\x94\x75\x92\x09\x94\x1B\x93\x0B\x94\xEE\x8B\x0D\x94\x05\x8B\xCE\x93\xAD\x8F\xD0\x93\xB9\x91\x80\x92\xD0\x88\x5A\x94\x71\x93\x5C\x94\xD7\x93\x5E\x94\x84\x94\x3D\x94\x85\x75\x41\x91\x0A\x93\xEF\x86\x47\x0F\xF1\x86\xE7\x1F\xC8\x91\xB4\x8C\xFE\x81\xE2\x92\x3D\x92\xD5\x94\x58\x93\xAA\x91\xE7\x93\xDA\x94\x08\x94\x01\x92\xEB\x93\xDE\x94\x79\x92\xBE\x94\x1D\x93\xC0\x94\x67\x93\x2D\x92\xD1\x93\xE6\x94\x70\x8C\xE8\x94\xAD\x43\xF8\x93\xAD\x8F\xFA\x93\xA9\x94\x1B\x94\x40\x91\x2D\x90\xE4\x84\x43\x8F\x3E\x90\x1D\x87\x2A\x82\x41\x90\x71\x90\xD0\x94\x9B\x10\x84\x8C\xB7\x84\x19\x88\xF6\x91\xFB\x94\x6B\x94\x3D\x86\xC3\x93\x05\x94\xB7\x94\xD6\x91\xE9\x93\xC8\x93\xAD\x8F\xCA\x93\x04\x92\x05\x95\x71\x93\x07\x95\xF1\x93\x09\x95\xE5\x94\x8E\x93\x61\x91\xC6\x94\xD5\x93\xBE\x91\x93\x93\x86\x92\x95\x93\x85\x94\x71\x93\xF4\x81\xAF\x8F\x4B\x90\x2E\x90\xC6\x7A\xAF\x8C\x5A\x82\xC9\x7A\xF6\x94\x0B\x93\x9B\x10\x51\x87\x05\x8C\x66\x94\x23\x95\x90\x94\x6C\x94\x48\x94\x9C\x92\x6F\x94\xF4\x8C\x71\x94\xF7\x8C\x01\x95\x4D\x92\x03\x92\x69\x8A\xCC\x93\xE1\x94\x0F\x94\xA3\x8B\x11\x94\xEE\x8B\x13\x94\xA3\x94\x7F\x94\xA5\x94\x81\x94\xA7\x94\x83\x94\xD9\x93\x60\x94\xAF\x6D\x3E\x8D\x41\x95\x16\x95\xB0\x88\xB0\x84\x79\x87\xEF\x1B\xFB\x7A\x09\x93\x42\x95\x31\x6D\x8F\x82\x2D\x8C\xCB\x86\x22\x95\x01\x94\x35\x93\xB4\x94\x25\x94\x80\x93\xD9\x94\x53\x95\xDB\x94\x56\x95\x0A\x94\x58\x95\x9A\x8C\x5A\x95\x9C\x8C\xE2\x94\x1D\x93\xE4\x94\x69\x93\x0B\x95\xBB\x91\x0D\x95\xF6\x43\x0F\x95\x1D\x93\x11\x95\x87\x92\xEE\x94\xD4\x7D\x6A\x95\x7E\x90\x52\x90\xF2\x94\x61\x82\xA9\x87\x6F\x30\xF1\x91\x96\x7E\x2B\x69\x74\x90\xB0\x87\xBE\x93\xEA\x90\x34\x93\x8F\x94\x7D\x93\x9A\x92\x6D\x94\x51\x95\x7E\x95\xA7\x93\xE6\x8B\xEA\x93\x57\x95\xAB\x93\x2E\x95\x85\x95\x51\x92\x87\x95\x71\x93\x89\x95\x57\x94\x8B\x95\x30\x92\x8D\x95\x32\x32\xEA\x94\xC9\x94\xEC\x94\x67\x95\x3D\x95\x79\x90\xCE\x94\xEA\x8F\x9E\x7F\x95\x95\xE9\x82\x46\x8E\x08\x93\x60\x89\xEC\x82\x64\x7B\xDD\x87\x9C\x7F\xEC\x8E\xB8\x6B\x16\x65\x35\x45\x50\x6F\xBF\x71\x3C\x0F\xFA\x72\x00\x00\x96\x00\x14\x8F\x4C\x8E\x9B\x10\x35\x45\x37\x6F\xDF\x79\xA3\x76\x09\x01\x98\x00\xD6\x95\xDF\x95\xD1\x95\x44\x0F\x35\x45\x20\x6F\xDB\x95\xD2\x95\x27\x01\x9A\x00\xE0\x95\xF3\x65\xB8\x6F\xFF\x6E\xFF\x8E\x16\x70\x09\x01\x9C\x00\xE9\x95\x34\x86\x40\x10\x9E\x00\x39\x8E\xF0\x86\xA8\x04\x29\x2F\x6F\x64\xDA\x6E\xC6\x01\x9D\x32\x77\x6D\x70\x0F\x9F\x00\xBE\x70\x9C\x7C\xCC\x8D\x1D\x65\x3E\x64\x43\x0A\xD8\x6F\xF4\x67\x71\x6F\x43\x0A\x2F\x09\x01\x96\x20\x65\x87\x6F\x32\x8E\x1C\x65\xFD\x5C\x99\x7C\x35\x7C\x93\x0A\x4A\x73\x1C\x75\x8E\x6D\x30\x74\x27\x0B\x51\x0C\xF8\x95\xC6\x64\xC1\x59\xBC\x66\xE3\x09\x2F\x09\x2E\x8E\x42\x63\x87\x6F\xF1\x72\xC5\x45\x0A\x24\x7B\x90\x6D\x90\x4E\x90\x71\x7C\x8E\x16\x47\x95\x98\x95\xDF\x95\x48\x91\x76\x90\x82\x88\xB9\x69\x82\x6F\x16\x85\x69\x24\xEB\x6C\x62\x71\x61\x45\x7B\x95\xA4\x93\xE4\x8B\xFE\x94\x7F\x95\x00\x95\x98\x94\x3F\x93\x2D\x94\x87\x93\x86\x91\xEF\x93\x88\x91\x08\x95\x7E\x92\x0A\x95\x35\x95\x81\x92\x37\x95\xE6\x91\xC8\x94\x34\x92\xCA\x94\xFD\x8B\x5E\x92\x97\x91\x48\x83\x99\x91\x6D\x91\x20\x83\x15\x89\xD5\x6D\x26\x8F\x74\x91\xB8\x84\x31\x96\x35\x65\x3C\x5A\x6B\x00\x35\x96\x21\x65\x37\x96\xD6\x94\x26\x95\xD8\x94\x06\x94\x29\x95\x96\x94\x14\x8C\xEB\x8B\x02\x95\x83\x95\x4F\x92\xB0\x95\xAE\x93\xB2\x95\x34", "\x4E\x5E\x95\xAD\x8F\x60\x95\xB4\x93\xF8\x92\xB6\x93\xFA\x92\xB8\x93\xFC\x92\x8E\x89\x50\x96\x6A\x91\xFF\x92\x62\x92\x79\x70\x78\x88\xC8\x29\xA5\x0B\x9C\x91\x34\x8F\x7D\x88\x9A\x90\x48\x0F\x3B\x7E\x3A\x89\x71\x6D\x32\x96\x47\x89\x34\x96\x71\x50\x36\x96\x67\x58\x96\x8D\xE3\x93\xA6\x95\x50\x95\x93\x94\x65\x96\x5D\x93\x67\x96\x5F\x93\x69\x96\xAD\x95\x40\x96\xCB\x93\x88\x93\x0E\x94\x44\x96\x32\x95\x46\x96\x34\x95\xC4\x94\x36\x95\x33\x8D\x28\x93\x39\x95\x5D\x94\x3B\x95\x5F\x94\xBE\x95\xC3\x91\x42\x63\xC5\x91\x5C\x20\xAD\x88\xFE\x8E\x1F\x6E\x68\x7E\x82\x86\xDA\x8B\x8A\x96\x5C\x96\xC2\x63\x86\x01\x5F\x96\x20\x65\x61\x96\xFC\x94\xE7\x92\x64\x96\x28\x95\x97\x96\x63\x8C\x68\x96\x3E\x8C\x2E\x88\x40\x8C\x95\x81\x42\x8C\x57\x7E\x5E\x7F\x29\x7E\x62\x7F\x18\x90\x8B\x8F\xED\x91\x4D\x8F\xEF\x91\xDC\x88\x1C\x95\xAE\x83\x77\x6D\x42\x8E\x9D\x90\x2C\x0F\xB8\x96\x50\x52\x8D\x96\x91\x14\x8F\x96\xC4\x6E\x10\x08\xB0\x83\xB1\x94\x06\x01\x8B\x96\xEE\x88\xDC\x96\x2D\x6E\xDE\x96\x40\x6F\x5B\x0A\x62\x96\x92\x94\x3B\x96\xAA\x95\xF3\x8C\xAC\x95\x82\x95\xAE\x95\x59\x95\x9E\x96\x5B\x95\xA0\x96\x10\x94\x33\x95\x8A\x95\x48\x96\xE7\x94\x4A\x96\xF7\x93\x4C\x96\x6F\x93\x4E\x96\x93\x91\xCC\x94\xF9\x6D\x07\x89\x65\x4E\xD8\x70\x16\x8E\x3F\x7E\xE2\x96\xE8\x2F\xDA\x96\x82\x76\xE6\x96\x04\x26\xE8\x96\xFB\x33\x0D\x08\x38\x96\x7E\x85\xA5\x93\xD7\x8A\xEE\x96\x52\x95\xF0\x96\xDD\x94\x6B\x96\x0C\x94\x2F\x95\x46\x4F\x6F\x96\x17\x3A\xB4\x95\x12\x94\x58\x94\x79\x48\xB8\x95\x1A\x4E\xBA\x95\x4D\x96\xBC\x95\xCB\x94\x68\x95\x35\x8F\x4A\x8D\x9B\x10\x3B\x92\x30\x96\x42\x6A\xE4\x96\xA8\x85\x0D\x97\xFD\x40\x0F\x97\x54\x60\xEA\x96\xBE\x96\xD7\x94\xA8\x95\x96\x96\x95\x94\xC3\x96\x99\x96\xC5\x96\x2C\x8B\xA0\x8B\x43\x96\x7C\x92\x45\x96\xC2\x94\x47\x96\xA4\x96\x49\x96\xA6\x96\xC7\x94\xA8\x96\xEB\x94\xAA\x96\xB1\x7D\x7B\x96\x60\x92\xD8\x92\x53\x96\x63\x92\x6E\x8F\x62\x8B\x70\x8F\x66\x90\xE9\x8C\x0A\x97\xD9\x81\x33\x97\x3D\x42\x35\x97\x7B\x4E\xDE\x02\x12\x97\xEF\x84\x76\x89\x27\x94\x32\x83\xC1\x96\x97\x94\x73\x94\x4F\x94\xDB\x91\x51\x94\x64\x93\x53\x94\x66\x93\xA1\x96\x45\x97\xA3\x96\xB3\x93\x26\x93\x49\x97\x38\x95\xB7\x93\x3A\x95\xB9\x93\x3C\x95\x93\x95\x6A\x8F\x7D\x90\x7B\x8F\x72\x0B\x15\x6D\x05\x93\x4B\x6F\x60\x90\xB7\x8F\xAE\x88\x6C\x95\x54\x6E\x84\x8F\x76\x95\x5A\x96\x30\x97\x0B\x97\xBB\x76\x5B\x97\x13\x45\x5D\x97\x01\x56\x5F\x97\xEB\x96\xA7\x95\x95\x96\x65\x97\xFF\x94\xB9\x94\xDC\x94\xBB\x94\x03\x95\x1D\x93\xE0\x94\x86\x95\x5C\x95\x8B\x93\x71\x96\x1D\x93\x73\x96\x72\x97\xB5\x93\xA7\x96\x75\x97\xA9\x96\x77\x97\xAB\x96\x79\x97\x4B\x8F\x65\x94\x80\x01\xB6\x92\xDF\x92\xB8\x92\x9B\x10\x92\x8F\x72\x8F\x06\x93\xE6\x65\x31\x97\x5E\x87\x8C\x97\x19\x00\x8E\x97\x84\x04\xFD\x3E\x60\x97\x04\x80\xC1\x92\x4A\x92\x66\x96\x3D\x97\x18\x97\x98\x97\x1A\x97\xDF\x94\x1C\x97\xC5\x59\x1E\x97\x8F\x63\x9F\x97\x71\x93\xA1\x97\xC5\x94\x73\x97\x4B\x96\x4B\x97\xBB\x95\x4D\x97\xBD\x95\xA9\x97\x51\x97\x40\x95\x93\x89\xDA\x92\x7F\x97\x63\x6F\x47\x03\x28\x8A\xB7\x92\xC8\x89\xFA\x89\x87\x97\xE8\x8C\xA9\x67\xB5\x97\x8B\x86\xB7\x97\xB9\x97\xCF\x5A\x24\x02\xBC\x97\xCB\x80\x5E\x93\x16\x97\x7E\x95\xC2\x97\xC9\x93\xBC\x94\x3C\x50\xC6\x97\x1A\x50\xC8\x97\x1A\x4E\x20\x97\x5F\x95\x22\x97\xA1\x48\x24\x97\x8D\x59\x26\x97\xFF\x96\x28\x97\xFD\x8B\x02\x97\xC7\x1C\x79\x8F\xA4\x87\x46\x02\x23\x8A\xDB\x92\x64\x6F\xB6\x8F\xDC\x97\xAE\x97\xDE\x97\x0C\x93\xF7\x87\x09\x97\x02\x01\xE3\x97\xD8\x89\xE5\x97\x60\x96\x90\x96\x0B\x8C\xEE\x84\xBD\x97\xC4\x93\xBF\x97\xC2\x96\x9F\x92\x2B\x95\x1D\x93\x2D\x95\xF3\x96\x42\x96\x9F\x96\x43\x97\x6E\x97\xB1\x93\xC3\x94\x71\x97\xCD\x97\xA3\x97\x4A\x97\xA5\x97\x4C\x97\xA7\x97\xED\x94\xAA\x94\xA0\x86\x8F\x79\xFA\x7F\x0C\x01\x94\x92\x10\x98\xAC\x91\x12\x98\xBC\x96\x14\x98\xE9\x97\xD8\x81\x15\x97\x4B\x94\xD0\x67\x28\x8B\x9A\x96\xF1\x96\x9C\x96\xAF\x95\xF4\x96\x9C\x97\xF6\x96\x5D\x95\xF8\x96\xB5\x95\xFA\x96\x0C\x95\xFC\x96\x0E\x92\x8F\x95\x71\x93\x91\x95\x78\x97\x2E\x98\x58\x8F\x30\x85\x53\x93\x4A\x91\xB7\x96\x5A\x97\xF5\x1C\xBB\x96\x1F\x65\xBD\x96\x24\x95\x61\x86\x63\x96\x3A\x97\x94\x97\x3C\x96\x96\x97\x81\x95\x19\x97\xF2\x96\x84\x95\x43\x98\xB1\x95\x9D\x97\xCF\x93\xCA\x97\xA6\x59\xF8\x97\x1A\x4E\xD4\x93\xCF", "\x97\x2A\x98\xD1\x97\x2C\x98\xD3\x97\x51\x98\xBD\x7D\x75\x93\xEA\x8E\x9E\x89\xE2\x97\x8A\x97\xAB\x77\x36\x98\x5A\x98\x38\x98\x91\x97\x94\x96\xED\x96\x3C\x98\xE7\x77\x0D\x8A\x60\x93\x26\x92\x6D\x84\x41\x96\x1F\x93\x7B\x92\x21\x93\xC1\x94\x24\x98\x46\x97\x26\x98\xA5\x96\x28\x98\x74\x97\x77\x96\x76\x97\x79\x96\x50\x98\x13\x95\x09\x90\xC0\x95\x1B\x90\xC6\x8A\xDB\x8F\x09\x01\x3F\x91\x98\x8D\xFB\x69\x34\x98\xD5\x91\x7D\x98\x1E\x65\x5B\x98\x4E\x95\x25\x95\xEC\x96\x63\x97\x8E\x83\x17\x97\x1C\x98\x71\x93\x1E\x98\x66\x98\x20\x98\xF5\x96\x22\x98\xF7\x96\xA2\x96\xF9\x96\x47\x97\xFB\x96\xCE\x97\xFD\x96\xD0\x97\x27\x97\xD2\x97\xD4\x8B\xBB\x93\x89\x96\xA1\x98\x7B\x98\xC9\x79\xA4\x98\x1D\x65\xA6\x98\xA5\x95\x91\x94\x92\x97\x82\x98\x64\x97\x19\x98\x66\x97\xD9\x91\x74\x94\x69\x97\x76\x94\x9C\x94\x78\x94\x9E\x94\x7A\x94\x56\x94\x21\x97\xB6\x95\x6B\x93\xFA\x97\x9E\x59\xFC\x97\xF9\x93\x70\x93\xF8\x39\x00\x98\xD7\x8F\x3F\x94\x81\x8D\xF7\x94\x48\x0F\xED\x8F\x0E\x98\xD9\x96\x57\x98\xB4\x06\x59\x98\xA5\x98\x7F\x98\x38\x97\x5E\x98\x93\x97\xCC\x98\x95\x97\x83\x93\xBA\x94\xEF\x97\x99\x97\xED\x93\xF2\x97\x09\x51\xF4\x97\x8D\x59\xF6\x97\x72\x96\x6D\x98\x8D\x59\x6F\x98\xBA\x98\x71\x98\xBC\x98\x73\x98\x29\x97\xAC\x96\x67\x92\x37\x79\x3E\x8B\xE7\x98\x22\x0F\xC2\x98\x11\x73\xC4\x98\x1C\x65\xC6\x98\x92\x96\xC8\x98\x81\x98\xAA\x98\x68\x84\x3B\x97\xC4\x96\xD2\x80\x63\x85\x82\x7F\x65\x85\xC9\x96\xED\x7F\xCB\x96\x30\x7F\xCD\x96\x08\x7A\x0C\x86\x4E\x35\xC0\x98\xCC\x69\xA2\x98\x65\x96\x0E\x99\x1B\x65\x10\x99\xA2\x93\x38\x93\x7C\x95\xB6\x94\xF1\x98\x61\x98\xF3\x98\x97\x97\xF5\x98\xC4\x97\x04\x95\x6D\x96\xBF\x94\xFA\x98\x9E\x59\xFC\x98\xA0\x97\xFE\x98\x9E\x59\x00\x99\x4C\x98\xFE\x96\xDD\x98\x00\x97\xEA\x91\xE0\x98\x30\x81\xDC\x93\x40\x94\x30\x7D\x42\x94\x06\x01\x37\x86\x99\x80\x7A\x98\xE9\x98\xBA\x96\x8E\x96\x13\x98\xDF\x96\x11\x97\x80\x98\xB5\x94\x72\x92\x60\x98\xEC\x97\x16\x99\x3E\x97\x18\x99\x3F\x8C\x1A\x99\x41\x8C\x5A\x7F\xCA\x96\xC3\x81\xCC\x96\xDE\x7E\xCE\x96\xF2\x8F\x3C\x0F\x63\x94\x33\x98\x0C\x99\x96\x73\x28\x99\x1A\x65\x2A\x99\x23\x94\xA3\x93\x13\x97\x3A\x96\x14\x99\x02\x87\x2F\x99\xEE\x97\x2C\x95\xF0\x97\x9C\x63\xF8\x98\x8D\x59\x31\x95\xB4\x98\x6F\x97\xB6\x98\x90\x98\x48\x97\x92\x98\x70\x98\x94\x98\xA6\x97\x96\x98\xA8\x97\x75\x98\x65\x99\x44\x0F\x4B\x99\xAE\x4C\x36\x91\x4D\x99\x6C\x82\x69\x24\x77\x6D\xFF\x7B\xE8\x29\x4F\x8E\xE8\x23\x69\x99\x37\x5F\xEA\x98\x50\x99\x37\x98\x52\x99\x39\x0A\xFF\x7B\xAD\x00\x06\x90\x0F\x98\x95\x99\x05\x3C\x97\x99\xDD\x96\x51\x99\xE9\x96\x74\x08\x16\x65\xA2\x91\x01\x01\xA3\x00\x9E\x99\xE8\x98\x8E\x99\xF5\x1C\x8C\x8F\x0C\x5C\xEF\x3D\xB5\x06\x03\x64\x88\x73\x36\x97\xA6\x99\x3C\x0F\xAF\x87\x03\x01\xAA\x99\xD8\x96\x0B\x99\x4E\x99\x7E\x7C\x80\x97\x07\x98\x50\x08\xF4\x49\x73\x34\x3F\x6F\x10\x97\x39\x0A\x16\x65\xFC\x8F\x47\x45\x1E\x8E\x5B\x96\xBD\x99\x2B\x69\x80\x81\x00\x00\x70\x61\x8C\x99\xB4\x97\xA0\x99\x3A\x5F\x6B\x00\x2B\x69\x72\x4B\xA6\x00\xF0\x8E\xE3\x96\xD3\x99\xDC\x25\x2B\x69\x0F\x7A\x2F\x49\xAB\x99\xBC\x99\xAD\x99\xA2\x99\xE7\x96\xA4\x99\xC5\x99\x09\x64\x2B\x69\xAF\x90\x45\x4D\x93\x99\xDA\x99\xBD\x99\xEB\x98\xC5\x98\x14\x98\x34\x86\x41\x50\xA8\x00\xD9\x99\x59\x97\xE2\x99\x86\x01\x2B\x69\x8F\x6E\x09\x01\xE4\x61\xE7\x70\xC1\x98\xED\x99\x98\x99\x7E\x98\x9A\x99\xE7\x99\x16\x65\xFD\x6E\x03\x01\xA9\x00\xF4\x99\x9F\x99\xBD\x99\x1B\x65\x2B\x69\x20\x4E\xAF\x00\x1F\x90\xE1\x99\x0A\x82\x6B\x99\x5A\x6C\xED\x98\x8C\x03\x62\x71\xCC\x5A\x2B\x69\x3E\x75\xBB\x55\x0E\x9A\x26\x99\x28\x95\x11\x9A\x68\x6C\x14\x98\x56\x7D\x18\x6B\x6D\x0C\xF8\x33\x16\x9A\x16\x65\xEB\x7C\xB0\x00\x1A\x9A\xDB\x99\x1D\x9A\x47\x0F\x61\x45\x20\x9A\x09\x6B\xA9\x0B\x2F\x36\xAE\x13\xCC\x5A\x8F\x79\x14\x90\x2F\x97\x56\x98\xF6\x99\x5E\x96\xFF\x99\xEC\x98\x01\x9A\xE8\x97\x54\x99\x2D\x99\x56\x99\x2F\x99\x58\x99\x60\x98\x75\x99\x1D\x98\x77\x99\x1A\x4E\x9B\x97\x68\x98\x45\x98\x9E\x97\x47\x98\xD7\x98\x49\x98\x8C\x95\x4B\x98\x83\x92\x4D\x98\x57\x3A\xDE\x98\x17\x3A\xEB\x91\xAB\x94\xE2\x98\x1C\x8D\x85\x97\x44\x0F\x6E\x39\xAC\x00\xE0\x99\x1B\x9A\xBF\x97\x2A\x9A\x43\x0F\x61\x45\x8F\x79\xD5\x7B\x03\x01\xAE\x00\x28\x9A\xFE\x99\xA3\x99\x99\x99\xA5\x99\xF0\x07\xAE\x7D\x5E\x66\xBA\x5F\xF0", "\x6A\xDA\x63\xFF\x01\x16\x65\x04\x8C\x35\x9A\xFD\x99\x37\x9A\xEE\x99\x0F\x99\x13\x9A\xA7\x98\x5D\x98\xA9\x98\x3B\x98\xCB\x98\xFF\x91\x55\x95\x3E\x96\xAA\x93\x41\x98\x1F\x98\x8A\x98\x42\x97\x8C\x98\x44\x97\x8E\x98\x70\x97\xF6\x92\x74\x96\x37\x94\x76\x96\x39\x94\x78\x96\x3B\x94\x92\x95\x87\x99\x92\x7F\x7A\x90\x34\x90\xCA\x6F\x86\x7B\xA1\x00\x1C\x7D\x23\x96\x39\x5F\xE0\x33\xF8\x37\xD6\x73\x7C\x98\xF5\x1C\xFF\x00\x86\x7B\xB2\x97\xBF\x99\x5C\x0A\x5E\x9A\x80\x9A\xD4\x99\x78\x9A\x29\x99\x7A\x9A\xC7\x98\x4F\x95\x55\x99\xBE\x97\xA9\x9A\xC0\x97\x1B\x98\xF4\x98\x76\x99\xF6\x98\xBD\x94\x36\x99\x06\x95\x38\x99\x9A\x83\x6B\x98\x5C\x4C\x3C\x99\x6A\x6D\x3E\x99\x50\x9A\x40\x99\x10\x95\x53\x9A\x0E\x3A\x44\x99\x59\x22\xF0\x94\x73\x95\x59\x1A\xF8\x81\x51\x8C\x32\x90\x2B\x96\x4F\x87\xF8\x94\xE0\x97\x78\x87\xCB\x99\x77\x9A\x39\x9A\xEF\x99\x3B\x9A\xD0\x8A\x3D\x9A\x39\x96\x0F\x8C\xCA\x98\xAB\x98\xED\x97\xAD\x98\xBA\x51\x45\x9A\x8D\x59\x47\x9A\x6E\x96\x69\x98\xE3\x94\xBD\x9A\x07\x4C\xBF\x9A\xEE\x83\x4F\x9A\x91\x93\x51\x9A\x17\x3A\x4F\x98\x86\x99\x98\x98\x58\x8F\xC9\x9A\x84\x97\x4D\x90\x18\x95\x7A\x0E\xF8\x0B\x1A\x95\x33\x90\x6C\x90\xD1\x7F\x44\x0F\x1F\x95\xA7\x8F\x86\x8C\x8D\x99\x10\x9A\x58\x98\xD6\x9A\x79\x9A\xD8\x9A\x91\x96\x2B\x99\xE4\x93\xDB\x9A\xE6\x93\x72\x99\xFD\x8A\x29\x94\x24\x92\xCE\x98\x68\x97\x62\x93\x6A\x97\x41\x97\x21\x98\x88\x9A\x23\x98\xF4\x92\xB2\x93\x8C\x9A\xA2\x97\x75\x96\xA4\x97\x83\x99\x2B\x98\x85\x99\x2D\x98\xF2\x9A\xEF\x94\x6B\x90\x97\x95\xCB\x9A\x44\x95\x4B\x87\x46\x95\x9C\x95\x64\x90\x5F\x82\xD2\x9A\x5F\x90\x25\x99\x29\x9A\x04\x9B\x69\x9A\x00\x9A\x6B\x9A\x13\x07\x39\x98\xCB\x85\xF0\x98\xB2\x9A\x1A\x98\xA8\x93\xE0\x9A\x17\x3A\xAF\x98\x6C\x96\x67\x98\xE5\x9A\x49\x9A\x6A\x98\x4B\x9A\xF7\x97\xD8\x98\xD3\x93\xDA\x98\x6A\x6D\xDC\x98\xC4\x9A\x42\x99\x1D\x93\x55\x9A\xA0\x86\xC3\x95\x26\x96\x89\x82\xCB\x7F\x6F\x95\x2D\x03\x71\x95\xC7\x95\xDE\x8C\x2C\x9B\xFF\x7A\x57\x97\x02\x9B\xF0\x80\x60\x9A\x3F\x0F\x6D\x99\x16\x98\xEA\x97\x98\x96\x41\x9A\x74\x99\x3D\x9B\x32\x32\x3F\x9B\x1B\x97\xB9\x9A\x30\x95\xBB\x9A\x9D\x6D\x3A\x99\xCB\x97\xEA\x9A\xBA\x6D\xC1\x9A\xED\x9A\xC3\x9A\x90\x95\xC5\x9A\x1A\x4E\x4F\x9B\xF3\x9A\x25\x9B\xF1\x94\x27\x9B\xA0\x90\x29\x7B\xAA\x87\x2B\x9B\x59\x9A\x14\x8D\xC0\x82\xA7\x8E\x36\x9A\x03\x9B\xE3\x99\x0E\x97\xE5\x99\xB5\x99\xF0\x07\x37\x9B\xAC\x86\xAE\x91\x65\x9B\x3A\x9B\xCD\x98\x86\x98\xCF\x98\x13\x9B\xD1\x98\x6B\x97\x9D\x94\x6D\x97\x7C\x99\x8A\x9A\x7E\x99\x1B\x9B\x27\x98\x1D\x9B\x29\x98\x1F\x9B\x72\x98\x21\x9B\x74\x98\x23\x9B\xD4\x7D\x96\x9A\xFC\x9A\x4C\x68\xE1\x81\xDD\x8C\xCC\x95\x7E\x9B\xBA\x82\xCD\x09\xCA\x95\x47\x8D\xC5\x95\x57\x84\x10\x8F\x84\x6B\x27\x01\xA8\x9A\x20\x73\xA9\x67\x25\x7C\x6F\x99\xCF\x1E\xF3\x3C\x45\x7D\x2E\x96\x3A\x8F\x0A\x99\xA4\x6F\x86\x6F\x45\x64\x6A\x1C\x8D\x9B\x62\x97\x7E\x9A\xDE\x9A\x59\x99\x43\x9A\xAE\x98\xE2\x9A\x9E\x59\xE4\x9A\x37\x99\xE6\x9A\x88\x95\xE8\x9A\x1A\x4E\xCC\x97\x91\x98\x9F\x9B\x93\x98\x90\x9A\x95\x98\x92\x9A\x3A\x8B\x4F\x97\x47\x83\x7A\x97\x1E\x83\x38\x7D\x55\x96\x71\x91\x25\x8F\x3C\x0F\xC2\x7D\x1F\x94\x71\x6D\xC2\x9B\xD9\x73\x8C\x58\xB1\x0E\xC6\x9B\x14\x97\x8F\x9B\x83\x98\xA0\x9A\x3D\x8C\x5B\x99\xC6\x96\x5D\x99\xC8\x96\x5F\x99\x1D\x99\x61\x99\x1F\x99\xBD\x75\xDD\x9B\x30\x7E\x52\x96\xE0\x9B\x31\x8F\xC7\x75\x33\x8F\xFC\x90\x77\x83\x7E\x88\x3C\x0F\x88\x96\xC1\x9B\x35\x65\x1C\x73\xE9\x74\x5C\x98\xB5\x87\x7D\x9A\xEF\x9B\x7F\x9A\x0F\x9B\x72\x94\x11\x9B\x99\x94\xD0\x98\x9B\x94\x97\x9B\xD3\x98\x99\x9B\x46\x98\xB5\x98\x48\x98\xB7\x98\x4A\x98\xB9\x98\x3F\x99\xBB\x98\xFD\x97\xBD\x98\xFF\x97\x2A\x97\x85\x96\xAE\x96\x79\x83\x54\x8D\xB1\x96\x72\x95\xF5\x9A\x43\x95\xCA\x91\xB5\x96\xE7\x9B\xFB\x69\xE9\x9B\x9E\x6F\xF4\x32\xEC\x9B\xDA\x9A\x70\x99\xDC\x9A\x0D\x9B\x49\x92\x91\x9B\x17\x99\x6C\x84\x36\x83\xF5\x9B\xFD\x84\x1C\x99\x99\x81\x1E\x99\x04\x81\x66\x95\x05\x99\xD4\x97\xFF\x92\x4C\x8F\x07\x6D\x4E\x8F\xAB\x83\x83\x97\x59\x9B\x7B\x8C\xF3\x91\x00\x00\x30\x8C\x09\x91\x5C\x0A\x32\x9C\x21\x96\xC4\x9B\x3E\x05\xED\x9B\x71\x99\xC8\x9B\x15\x99\x42\x9A\x67\x9B\x51\x51\xCD\x9B\x6A\x6D\xCF\x9B\xBA\x9A\xD1\x9B\xB3\x95\xD3\x9B\x8D\x59\xD5\x9B\x80\x99\xD7\x9B\x82\x99\xD9\x9B\x84\x99\xDB\x9B\xF1\x9A\xC7", "\x8F\x52\x8A\x5A\x8F\x0E\x93\x55\x9C\x47\x0F\x0A\x9C\xB8\x8E\xEE\x98\x0E\x9C\xD7\x91\x90\x9B\x11\x9C\x81\x9A\x67\x97\x14\x9C\x95\x9B\x16\x9C\x15\x9B\xB2\x98\x17\x9B\x9A\x9B\x19\x9B\x25\x98\x9D\x9B\xD6\x9B\x8E\x9A\x1E\x9B\x6C\x9C\x20\x9B\x6E\x9C\x22\x9B\x70\x9C\xF3\x81\x3A\x92\x25\x83\xA3\x91\xB9\x69\x74\x9C\x43\x0F\x76\x9C\x7C\x85\xD6\x81\x0B\x9B\x26\x94\x5B\x9C\x73\x99\x3B\x9C\x5A\x99\x3D\x9C\x19\x99\xA5\x82\x1B\x99\xF7\x9B\x42\x9C\xF9\x9B\x44\x9C\xFB\x7D\x67\x8F\x96\x91\x7C\x96\x86\x94\x7E\x96\x89\x0E\x64\x92\x2D\x71\x66\x92\x49\x88\x68\x92\x2E\x9B\xAD\x9B\x54\x9C\x09\x9C\x57\x9C\x0B\x9C\x7B\x9A\x0D\x9C\xC9\x98\x39\x9C\xE8\x8B\x66\x9B\xB5\x9A\x44\x9A\xB7\x9A\xF1\x97\x6B\x9B\x1D\x97\x64\x9C\x70\x96\x45\x9B\xFD\x98\x47\x9B\x59\x94\xEC\x9A\x5B\x94\xEE\x9A\x32\x32\xF0\x9A\x8F\x9C\xB2\x92\xED\x90\xD9\x92\x39\x7F\x7E\x97\x7E\x8F\x6E\x95\xE1\x84\x09\x98\x4D\x9C\xB9\x8F\x8E\x10\x93\x92\x08\x9C\x21\x65\x98\x9C\x59\x9C\x38\x9C\x9D\x9C\x0E\x9B\x4C\x94\x7D\x9C\x13\x9C\x3F\x96\x9A\x94\x89\x98\x77\x94\x20\x93\xF2\x92\xB0\x93\x86\x9C\x8F\x98\x88\x9C\x69\x9C\x8A\x9C\xA0\x9B\x8C\x9C\xA2\x9B\x8E\x9C\xA4\x9B\x90\x9C\xEC\x91\x3A\x8E\xBA\x6A\xAD\x97\xDC\x9C\xE0\x92\x86\x84\xF9\x94\x42\x6A\x96\x9C\x3F\x0F\xE2\x9C\x36\x9C\x61\x97\xEE\x9B\x7A\x9C\xF0\x9B\xB0\x7F\x2C\x88\x88\x98\x9D\x96\xB1\x98\x44\x98\xB3\x98\x1A\x9C\x7D\x99\x1C\x9C\x7F\x99\xB8\x98\x81\x99\x01\x99\xA1\x9B\x03\x99\xA3\x9B\x46\x9C\x94\x9A\x89\x92\x7B\x97\xF2\x89\x97\x7F\xD9\x97\xFC\x89\xC0\x99\x82\x97\xB2\x96\x01\x9D\x8D\x63\xA6\x8F\xA5\x9A\x7E\x74\xE8\x9B\xB8\x9C\x34\x9C\x69\x19\xE3\x9C\x0C\x9B\xE5\x9C\x3A\x9C\x7C\x9C\x4B\x92\x63\x98\xC3\x97\x65\x98\x40\x9B\x11\x9D\x48\x9A\x13\x9D\x4A\x9A\x1B\x9C\x4C\x9A\x1D\x9C\x4E\x9A\x1F\x9C\xC2\x9A\x21\x9C\x41\x99\xFE\x97\x01\x97\x25\x9C\xF3\x24\x02\x98\xD6\x87\x04\x98\x03\x93\xB3\x8F\x49\x87\xB5\x8F\xDA\x9C\xDE\x92\x00\x9D\xAF\x97\x48\x0F\x0D\x93\xF5\x91\x31\x9C\x2F\x9D\x8D\x33\x35\x9C\x78\x9C\xBD\x9C\x34\x9D\xBF\x9C\x9F\x9C\xCB\x9B\xE1\x9A\xC3\x9C\x78\x99\xC5\x9C\xC7\x97\xC7\x9C\x1F\x97\x66\x9C\x9E\x59\x68\x9C\x18\x9D\x6A\x9C\x1A\x9D\xF7\x9C\x1C\x9D\xF9\x9C\x1E\x9D\xA5\x9B\x92\x7F\x30\x98\x0C\x85\x59\x9D\xCC\x69\x05\x9D\x3B\x0F\x07\x9D\x5E\x9D\x13\x99\x60\x9D\xF5\x8C\x62\x9D\x5E\x9C\x8D\x59\x69\x9B\xC5\x97\x67\x9D\xF3\x97\x69\x9D\xC9\x97\xC9\x9C\x3B\x99\xCB\x9C\x23\x97\xCD\x9C\xE9\x94\xCF\x9C\x74\x59\x77\x9B\x8D\x59\x79\x9B\xC8\x7D\x3C\x0F\x75\x93\xEC\x8D\x53\x9C\x27\x01\x7B\x9D\x97\x66\x30\x9D\x30\x23\x32\x9D\x9C\x9C\x0F\x9C\xC9\x9B\x5D\x9C\xC1\x9C\xCC\x9B\x65\x9D\x46\x9A\x79\x99\x9E\x59\x7B\x99\x14\x9D\x9B\x9B\x16\x9D\xF3\x9C\x6E\x9D\xF5\x9C\xD8\x9B\xA6\x94\x91\x9A\xA8\x94\x93\x9A\x75\x9D\x1E\x8F\xD0\x8F\x76\x93\x30\x9C\x7A\x9D\x5B\x9D\xAA\x66\x9F\x9D\x08\x9D\x17\x98\x27\x95\x40\x9A\x0C\x9D\x34\x83\xF3\x9B\x40\x97\xC7\x96\x40\x9C\xA5\x9C\x01\x85\x43\x9C\xCE\x83\x45\x9C\x24\x9C\x06\x99\xCC\x6C\xA7\x9B\x26\x9B\x8E\x79\xC7\x8A\x32\x91\x9C\x93\x9B\x9D\xBD\x9D\xEB\x9B\x31\x9D\xC0\x9D\x63\x9B\x3D\x97\x7B\x9C\xE7\x9C\x37\x9D\x82\x9A\x6A\x96\x3A\x9D\x6A\x9B\x41\x9B\xD0\x9B\x43\x9B\xE7\x9A\x8B\x9D\x70\x9B\x8D\x9D\xF9\x97\x8F\x9D\x0E\x95\x75\x9B\x4E\x98\x93\x9D\x22\x82\xBF\x98\xE0\x9C\x0C\x96\xB9\x9C\x77\x9C\x0C\x9C\x1B\x89\xB0\x9A\x18\x98\x9F\x9C\xDF\x9D\x3D\x98\xF2\x9B\xA1\x9C\x5C\x99\xA3\x9C\x5E\x99\xFE\x80\x31\x8D\x1C\x9B\xB1\x9D\x6B\x9C\xB3\x9D\xDA\x9B\xB5\x9D\x97\x98\xFB\x9C\x56\x9A\x46\x99\xE3\x98\x48\x95\xE5\x98\xC1\x80\x73\x9C\xD9\x9D\xBB\x60\x5D\x9D\xF9\x9D\x74\x89\x9B\x9C\x7D\x95\x59\x99\xFE\x9D\x84\x98\x3E\x98\x3F\x97\x9F\x8B\xC8\x9D\xB7\x89\xD6\x98\x46\x9B\x4D\x9A\xB7\x95\xEE\x9D\x8E\x95\xF0\x9D\x52\x9A\x4D\x9B\x71\x93\x95\x9D\x88\x99\x9B\x10\xBC\x8F\xB1\x8B\xAF\x99\x2E\x9D\xE1\x9C\xF7\x9D\x99\x9C\xC9\x85\x1B\x9E\x2E\x99\xFD\x9D\xC4\x9D\x61\x85\xC6\x9D\x22\x9E\x3F\x9C\x24\x9E\x41\x9C\xCB\x9D\xA7\x9C\xCD\x9D\x20\x99\xE3\x80\x09\x81\x1E\x94\x55\x98\x5A\x9D\x36\x9E\x9E\x9D\xC5\x9B\xDC\x9D\x3A\x98\xA2\x9D\x5C\x9C\xC0\x9C\x32\x99\xB6\x9A\x34\x99\x9A\x97\xA9\x9D\x6A\x6D\xAB\x9D\x3F\x9D\x15\x9D\x41\x9D\x17\x9D\x1E\x9C\x19\x9D\x20\x9C\x02\x99\x22\x9C\x04\x99\xCF\x9D\x47\x9C\x86\x94\xD2\x9D\x7C\x9B\x8E\x79\x49\x99\x60\x4B\x15\x9E\x4D\x9E\x5C", "\x9D\xDB\x9D\x7E\x9D\xFB\x9D\xC2\x9D\x3C\x9E\x10\x9C\xE0\x9D\x5F\x87\xE2\x9D\x9B\x96\xEB\x9C\x10\x9D\x86\x9A\x16\x9B\xEF\x9C\x8D\x98\xF1\x9C\x8B\x9A\x35\x94\x8D\x9A\xA4\x94\x8F\x9A\x0A\x9E\x6D\x9C\x0C\x9E\x6F\x9C\xD3\x9C\xAF\x8B\x66\x99\x0D\x90\x54\x93\x95\x9C\x16\x9E\xDB\x6E\x18\x9E\xBB\x9C\xFA\x9D\x3E\x9A\xB1\x9A\x36\x9D\xB3\x9A\x3C\x9B\xA5\x9D\x64\x9D\x57\x9E\xF7\x98\x87\x9D\xF9\x98\x89\x9D\xF5\x97\x6B\x9D\x6A\x6D\x6D\x9D\x60\x9E\x6F\x9D\x62\x9E\x1B\x9D\x64\x9E\x1D\x9D\x66\x9E\x1F\x9D\x99\x8F\x12\x90\x8D\x63\x34\x9A\x94\x9C\x04\x9D\x91\x9E\xFB\x95\x93\x9E\xAE\x9A\xA8\x98\x5F\x9D\x52\x9E\x9E\x9C\x98\x9E\xC2\x8B\x79\x9E\x40\x98\x7B\x9E\x42\x98\x3C\x9D\x42\x9B\x3E\x9D\x44\x9B\x40\x9D\x26\x9E\x42\x9D\x28\x9E\x44\x9D\x74\x9B\x46\x9D\x4C\x9B\x48\x9D\x43\x99\x4A\x9D\xF9\x6D\x69\x9E\xCA\x9A\xD4\x9D\x0D\x7A\x09\x01\xDE\x99\x4B\x9E\xBC\x9D\x6F\x9E\xBE\x9D\x4F\x9E\x72\x9E\x96\x9E\xFC\x9D\xBC\x9E\x3C\x97\xB4\x9A\x55\x9E\xC2\x9C\x9D\x9E\xB8\x9A\xE6\x9D\x63\x9C\xE8\x9D\xD2\x9B\xEA\x9D\x6C\x98\xEC\x9D\x6E\x98\x49\x9B\x9D\x6D\x4B\x9B\x76\x9B\x2D\x9E\xDF\x98\xD0\x9E\xC7\x1C\xD2\x9E\x2C\x9C\x74\x95\x00\x8F\x27\x90\xB6\x9C\xD8\x9D\xDA\x9E\xDA\x9D\xBF\x9D\xDD\x9E\x3A\x9E\x3F\x9A\x75\x9E\xA3\x9D\x54\x9E\x38\x9D\x33\x99\xE4\x9D\x86\x9D\xE7\x9E\x6C\x9B\xA1\x9E\xFB\x98\xA3\x9E\x9D\x6D\xA5\x9E\x43\x9D\x61\x9E\x45\x9D\x63\x9E\x47\x9D\x23\x9C\x49\x9D\xD0\x9D\x48\x6E\x15\x95\x4E\x9C\xF6\x9A\xF3\x94\xCD\x9A\x0C\x8F\xFB\x9A\xD3\x9D\xFE\x7A\x44\x0F\x36\x90\x4B\x95\xB7\x9C\xFE\x9E\x17\x9E\x71\x9E\x19\x9E\x82\x8A\x02\x9F\x97\x9E\x77\x9E\x3B\x9B\xAB\x95\x83\x9D\x9E\x59\x85\x9D\x35\x99\x0B\x9F\xC6\x9C\xE9\x9E\x65\x9C\xEB\x9E\xBE\x9A\xED\x9E\xFF\x98\xEF\x9E\xBA\x6D\xF1\x9E\xF1\x9D\xF3\x9E\x54\x9A\xC7\x9A\x3F\x95\xE6\x74\xED\x86\x5E\x90\xA4\x73\x29\x82\x7E\x8C\x98\x7A\xDD\x97\x90\x8F\x1E\x95\x03\x9D\x35\x9E\xF6\x9D\x4E\x9E\x58\x9C\x50\x9E\x38\x9B\xDD\x9A\x53\x9E\x82\x9D\x9B\x9E\x3E\x9B\x60\x9C\x9D\x6D\x62\x9C\x0C\x9F\x38\x9F\xC8\x9C\xC6\x9E\xCA\x9C\x27\x9E\xD9\x98\x29\x9E\xB9\x95\x91\x9D\x8D\x59\xD1\x9C\xFA\x9C\x8B\x9E\xE3\x82\x51\x9B\x48\x9F\x5F\x8E\x45\x95\xB1\x8C\x4D\x87\x34\x90\x2D\x9B\x45\x90\x77\x95\x4C\x9E\x52\x9F\x70\x9E\x00\x9F\x2B\x9F\xC0\x8C\x73\x9E\xC0\x96\xC3\x9D\x76\x9E\xFF\x9D\x2A\x94\x7E\x9C\xEA\x9C\x15\x9C\xEC\x9C\xD2\x98\xEE\x9C\x79\x94\xF0\x9C\x33\x94\x1A\x9B\x83\x9E\x07\x9E\x85\x9E\x8B\x9C\x87\x9E\x8D\x9C\x89\x9E\xD2\x9C\x64\x99\x2C\x90\x7B\x97\x52\x9B\xFE\x6F\xDA\x97\xAB\x0A\x70\x95\x7B\x87\x99\x9F\x65\x90\xB5\x9C\x0F\x8D\x51\x9F\x1F\x65\x7D\x9D\x7C\x9F\x1D\x92\x7E\x9F\x5F\x98\x80\x9F\x05\x9F\x59\x9F\xE3\x9E\xA6\x9D\xE5\x9E\xC4\x9C\x36\x9F\x68\x9D\x60\x9F\x6A\x9D\x3A\x9F\xE9\x9A\x3C\x9F\x3D\x99\x3E\x9F\x03\x54\x40\x9F\x2C\x9E\xCE\x9E\x4E\x9B\x44\x9F\x6E\x9F\xA8\x9B\x54\x8E\xBB\x82\x73\x9F\xA8\x9B\x9E\x95\x84\x9B\xC2\x82\x27\x9F\x79\x9F\xDB\x9E\x54\x9F\x01\x9F\x37\x9C\x33\x9D\xBA\x9E\xE6\x9C\x82\x9F\x10\x9B\x93\x9B\x12\x9B\x0F\x9D\xC1\x9E\x7D\x9E\x83\x9C\x7F\x9E\x89\x9A\x81\x9E\x9C\x9B\x8E\x9F\x9E\x9B\x08\x9E\x70\x9D\x92\x9F\xF8\x9C\x94\x9F\x6B\x9F\x96\x9F\x1E\x8F\xF7\x9E\x1C\x9F\xE6\x82\x7B\x9B\x71\x7C\xB4\x8E\x06\x8F\x88\x6F\x2D\x9D\x83\x90\xEE\x82\xCB\x95\xB2\x9B\x5A\x77\x2C\x97\x48\x0F\x3C\x06\xB1\x00\xF1\x95\xD7\x95\x87\x96\x4C\x8D\x8C\x90\x5C\x0A\x8F\x73\x27\x88\x8D\x05\xC2\x9F\x40\x8F\x29\x9C\x00\x91\xD7\x90\xA5\x90\x04\x71\xCA\x99\x42\x6A\x00\xA0\x8C\x87\x02\xA0\x8F\x79\x0C\x71\x0E\x9A\x0C\xA0\xD5\x8A\x8D\x05\x20\x91\x68\x8D\x96\x74\x23\x91\x98\x74\x25\x91\x37\x75\x27\x91\x8E\x10\x72\x8E\xF7\x90\x42\x67\x88\x86\x14\xA0\x05\x91\xE7\x77\x78\x8D\xE2\x8E\xD9\x90\xC9\x8D\x8E\x10\xAB\x74\x1F\xA0\x06\x01\x12\xA0\xE9\x92\x22\xA0\xF5\x81\x86\x8E\x03\x9C\xB8\x14\x34\x9E\xE4\x90\x9A\x8D\x0C\x91\xD0\x90\x8E\x10\x8D\x8D\x11\xA0\xDB\x99\x94\x05\xB1\x8D\xD6\x90\xA6\x6B\xFD\x9C\x15\x75\x1A\x91\x37\xA0\x1C\x91\x71\x0F\xC6\x74\x2B\xA0\x40\x67\x21\xA0\x8C\x01\x15\xA0\x97\x68\xE1\x90\x08\x91\xE3\x90\x19\x91\xC9\x8E\xBB\x8E\xD5\x74\x01\x8F\x68\x94\x0B\xA0\x3C\xA0\x2F\xA0\xD9\x8D\x03\x9C\xB4\x8D\xCD\x90\x52\xA0\xE6\x90\xE2\x74\xCB\x8D\xBF\x72\x71\x6D\x2D\xA0\x5C\x93\x59\xA0\x46\x9F\xB8\x65\xFB\x90\xA2\x8E\x5F\xA0\xBC\x8E\x8D\x74\x7A\x93\x63\xA0\x58", "\xA0\x4B\xA0\x23\xA0\x51\x67\x07\x91\xD7\x90\xB5\x90\x35\xA0\xA9\x8D\x44\xA0\x2B\x69\x0F\x91\x3B\xA0\x4A\xA0\xF0\x09\xDF\x90\xB8\x0E\x04\x75\x75\xA0\x09\x91\x42\xA0\x5E\xA0\x1B\x91\x32\x6A\x61\xA0\x3A\x71\xFB\x69\x64\xA0\x96\x96\x66\xA0\x42\x72\x01\x75\x7E\x72\x5D\xA0\xE5\x90\x86\xA0\x44\x6A\xE7\x8E\x87\x74\x20\xA0\xDD\x83\x0E\xA0\x0A\x9A\x16\x65\x30\x91\x0A\xA0\x6F\xA0\x7D\xA0\x34\x47\x34\x91\x00\x75\xF8\x8E\x97\xA0\xBA\x83\x99\xA0\x15\x8E\xE8\x87\xC7\x90\x8B\xA0\xC1\x96\x8D\x05\xF4\x9A\x44\xA0\x43\x91\x3C\x04\x32\x90\x46\x91\xDC\x68\x35\x8E\xF5\x8D\x03\x01\xB2\x00\x9B\x9A\x19\x85\x7F\x36\x9D\x9D\x9F\x40\x93\x1E\xFA\x7C\x49\x75\x93\x9C\x2E\x8A\x42\x6A\x6E\x52\x4F\x7D\xF5\x72\x89\x3B\xA0\x9D\x1C\x9E\x57\x99\x3D\x9E\xBB\x87\x21\x9E\x18\x8C\x82\x9C\x12\x9D\x84\x9C\xAC\x9D\xDC\x9F\xAE\x9D\xDE\x9F\x89\x9C\x90\x9F\xF6\x9C\xE2\x9F\x72\x9D\xE4\x9F\xD4\x8B\xFC\x9B\x22\x84\xE1\x6C\xAE\x9C\x02\x01\x80\x96\xCE\x06\x39\x0C\x70\x91\x9D\x91\x03\x97\x58\x96\x2F\x96\xB2\x9E\x71\x6D\xC3\xA0\x1A\x65\xB3\x72\x63\x38\xC7\xA0\x3B\x9E\xE0\x9E\xF2\x98\x2A\x95\x5A\x9F\x68\x9B\x5C\x9F\x10\x84\x59\x9E\x9D\x6D\x5B\x9E\xC5\x9E\x5D\x9E\xC7\x9E\x5F\x9E\x12\x9F\xA7\x9E\x14\x9F\xA9\x9E\x16\x9F\x65\x9E\x93\x91\xDC\xA0\x74\x88\xDE\xA0\x8C\x90\xAF\x9C\x9B\x91\xC9\x75\xAD\x96\xBE\xA0\xA0\x91\x09\x01\xA8\x99\x4C\x99\xE6\x65\xEB\xA0\x19\x65\xED\xA0\xA5\x3E\xEF\xA0\x03\x9F\xF1\xA0\x30\x99\xF3\xA0\xAD\x9F\x9C\x9E\x09\x9F\x35\x9F\xC2\x9E\xE7\x9D\xC4\x9E\xE9\x9D\x62\x9F\x8C\x9D\x64\x9F\x48\x9B\x66\x9F\x25\x97\x68\x9F\x9E\x59\x6A\x9F\x74\x9D\x0E\x9E\x2F\x98\x3E\x8F\xD9\x03\x55\x8E\x05\xA0\xCF\x9A\xD4\x9D\xB1\x88\xCB\x91\xD8\x9E\x5C\x0A\x14\xA1\x42\x63\x16\xA1\xA6\x36\x18\xA1\x2E\x9F\xD2\x9F\xC3\x92\x62\x98\xBE\x9E\x64\x98\x84\x9A\xB0\x98\xD8\x9F\xCF\xA0\xDA\x9F\x18\x9B\x8C\x9F\x87\x9C\xD4\xA0\xF4\x9C\xD6\xA0\xB2\x9D\x64\x95\xB4\x9D\xCE\x9D\x18\x9F\x67\x9E\x3E\x95\x49\x9C\x6E\x7F\x4B\x9C\x35\xA1\xC3\x6C\x50\x9C\x52\x9C\x50\xA0\x3A\xA1\x35\x65\x3D\xA1\x66\x3B\x3F\xA1\xDF\x9E\x2F\x9F\xE1\x9E\x9A\x9E\x1D\xA1\x5B\x9F\xA7\x9D\xE3\x9A\xF8\xA0\xBA\x6D\xFA\xA0\x24\xA1\xFC\xA0\x63\x9F\xC8\x9E\x65\x9F\xCA\x9E\xCE\x9C\x2B\x9E\xEF\x9A\xF2\x9D\xC8\x81\x44\x9F\x15\x92\x11\x89\x79\x9D\x60\xA1\x21\x65\x62\xA1\x15\x1E\x64\xA1\x74\x9E\x1A\xA1\x1E\x9E\xF1\x9B\x83\x9F\xE9\x9C\x83\x9A\xC0\x9E\x85\x9A\xED\x9C\x8B\x98\x4A\xA1\x85\x9C\x4C\xA1\xF2\x9C\x4E\xA1\xB0\x9D\x50\xA1\x09\x9E\x52\xA1\x0B\x9E\x54\xA1\xCF\x9E\x19\x9F\x57\x96\xE6\x95\x09\x01\xE1\x3E\xA7\xA0\x62\x8F\xC0\xA0\x12\xA1\xB9\x69\x3B\xA1\x47\x0F\x81\xA1\x81\x33\x83\xA1\x7F\x9F\x04\x9F\x58\x9F\x1A\xA1\x63\x9D\x6A\xA1\xAF\x9F\x66\x9D\xB1\x9F\x88\x9D\xB3\x9F\x8A\x9D\x25\xA1\xEB\x9D\x27\xA1\xCC\x9C\x75\xA1\x90\x9D\x77\xA1\xD0\x9C\x79\xA1\x9D\x6D\x94\x91\x89\x0C\xAB\x9C\x50\x97\x7D\x96\x09\xA1\xE0\xA0\xB0\x9C\x46\x6F\xB2\x9C\x07\x7E\xB4\x9C\x76\x9F\x88\x97\xEA\xA0\x61\xA1\x22\x66\x51\x61\x62\x01\xA9\xA1\xA9\x9F\xAB\xA1\xBB\x9E\x66\xA1\x3C\x9C\x0E\x9D\x3E\x9C\x03\x9E\xF6\x9B\x05\x9E\x60\x99\xED\x81\x62\x99\xF1\x81\x08\x7A\x4C\x9D\x9C\x8F\x52\x84\xD7\x9C\xB4\x8F\xD9\x9C\xDD\x92\x81\x8F\xD4\x96\x25\x90\x9B\x10\xDF\x9C\xBB\x9D\x7F\xA1\x20\x65\xA7\xA1\x4E\x06\xD3\xA1\x39\x9B\x85\xA1\xCA\xA0\x85\x98\x3F\x98\x45\xA1\x8B\xA1\x47\xA1\x8D\xA1\x87\x9A\x8F\xA1\xD1\xA0\x91\xA1\x82\x9E\xA2\x94\x84\x9E\x62\x95\x86\x9E\x97\xA1\x88\x9E\x99\xA1\xBE\x9F\xF5\x9E\x80\x84\x65\x7F\x82\x84\x8E\x8F\x4D\x9F\xEB\x8F\x8E\x10\xB1\x97\x24\x99\xF0\xA1\x1F\x65\xF2\xA1\x5F\x06\xF4\xA1\x57\x9F\xD6\xA1\x41\xA1\xE8\x9C\xD4\x9F\x7F\x9C\xD6\x9F\x8C\xA1\x88\x9F\x8E\xA1\x8A\x9F\x80\x9E\x01\xA2\xDD\x9F\x03\xA2\x8F\x9F\x05\xA2\x91\x9F\x07\xA2\x93\x9F\x09\xA2\x2E\x9E\x44\x9F\xE3\xA1\x51\x84\x0B\x0D\x9E\x8F\xD8\x9C\xF5\x89\x08\x98\x54\x9D\x28\x9D\x56\x9D\x2A\x9D\x50\x9F\xFB\x69\xA5\xA1\x43\x0F\x17\xA2\xD2\xA1\x55\x9F\x8E\x9B\x0B\x9D\x81\x9F\x1F\x9E\x00\x9E\xD9\xA1\xA2\x9C\x6E\x86\xA4\x9C\xDD\xA1\xF8\x9B\xDF\xA1\xFA\x9B\xE1\xA1\x04\x91\x7B\x97\x05\x98\x24\x9D\x57\x8C\x81\x97\xDB\x9C\x39\xA2\x0B\x98\x9B\x10\x58\x9D\x8F\x9E\xC2\xA0\xCF\xA1\x69\x44\xC6\xA0\x42\xA2\xC7\x9B\xD0\x9F\x35\x9D\xD7\xA1\xA0\x9C\x48\xA2\x02\x9E\x4A\xA2\x04\x9E\x9F\x84\x06\x9E\xDF\x9F\x95\xA1\xE1\x9F\x2C", "\xA2\xE3\x9F\x2E\xA2\xF4\x9E\x9B\xA1\x81\x6D\x77\x9D\x54\x8A\x0E\x93\x3E\xA2\x3F\x0F\x40\xA2\xDC\x8D\xA6\x9F\xBF\x92\xA8\x9F\xF5\xA1\x65\xA2\x86\xA1\x0D\x9D\x2A\x8B\x20\xA2\xFC\xA1\x22\xA2\xFE\xA1\x24\xA2\xDB\x9F\x26\xA2\xD3\xA0\x28\xA2\x6D\xA2\x2A\xA2\xD7\xA0\x70\xA2\xD9\xA0\x72\xA2\x43\x9F\x0B\xA2\xC0\x1C\x53\x98\x44\x78\x7E\xA1\x27\x01\x79\xA2\x3B\x0F\x7B\xA2\x19\xA2\xBE\x9C\x81\x9D\xAD\xA1\x32\x9F\x6A\x6D\x34\x9F\x58\x9E\x9F\x9E\x7A\x99\x6D\x9B\x0C\x83\x0F\x9F\xBA\x6D\x11\x9F\xC9\x9E\x13\x9F\xCB\x9E\x15\x9F\xCD\x9E\x17\x9F\x9A\xA1\x56\xA1\x9C\x8A\xF9\x8E\x39\xA1\x9A\xA2\x5E\xA2\xC5\xA0\xF3\x40\x9E\xA2\x80\x9D\x54\x95\xE1\x9D\x84\x9F\x8A\xA1\x86\x9F\x7C\x9E\xFD\xA1\x7E\x9E\x89\xA2\x4B\xA1\xA0\x94\x8D\x9F\x8D\xA2\xD5\xA0\x8F\xA2\x51\xA1\xAE\x92\x03\xA1\xAB\x9E\x55\xA1\xAD\x9E\xFF\x92\xE8\x9F\x09\x88\x3C\x0F\x9B\x93\xF9\x86\x15\xA2\x1E\x65\x9D\xA2\x61\xA2\x0A\x9D\xEB\x97\xF7\xA1\x20\x9E\x3F\x9E\xCD\xA0\x23\x9E\x30\x8B\x43\x9E\x56\x89\xCC\x9D\x14\x87\x93\xA2\x0E\x3A\xF4\x9D\xEF\xA1\xB8\xA2\x80\xA1\xD0\xA1\x55\x61\x41\xA2\xCD\x9F\x09\x9D\x5A\x9C\x63\xA2\x61\x9D\xA1\xA2\xF4\xA0\x5F\x9C\x6B\xA1\xCE\x9B\x6D\xA1\x03\x54\x6F\xA1\xEA\x9E\xB6\xA1\xEC\x9E\xB8\xA1\x8E\x9D\xBA\xA1\xEF\x9D\xCC\x9E\xF2\x9E\xBD\x9F\x2F\xA2\x95\xA2\x9E\x6D\x10\x9E\x58\x9A\xE4\x98\xEC\x8F\x14\x9E\x99\xA2\x6D\x27\xB9\xA2\x29\x67\x60\xA2\xF2\xA2\xC1\x9D\xAA\xA1\xF6\xA1\x45\xA2\x87\xA1\xD3\x9F\xF9\xA1\x39\x9D\x46\xA1\x3B\x9D\x48\xA1\x3D\x9D\xD0\xA0\x5C\x9E\xAD\x9D\x5E\x9E\xAF\x9D\xA6\x9E\xE0\x9F\xA8\x9E\x71\x9D\xAA\x9E\x73\x9D\xAC\x9E\xB7\x9D\x99\x8F\xE7\x85\xF4\x8F\x11\xA3\x06\x01\x9B\xA2\xF4\x72\x14\xA3\xBB\xA2\xDC\xA2\xF4\xA2\x44\xA2\xAB\x9F\xF7\xA2\x69\xA1\xF5\xA0\xFA\xA2\x61\x9C\xFC\xA2\x21\x85\xA8\xA2\x70\x81\xAA\xA2\x03\x54\xAC\xA2\x74\xA1\xAE\xA2\x76\xA1\x06\xA3\x41\x9F\x08\xA3\x73\xA2\xB4\xA2\x55\x97\x48\x0F\xFB\x8F\x94\x92\x35\xA3\x66\x05\x37\xA3\xD1\xA1\x7C\xA2\x94\x9E\x1A\x9E\xCE\x9F\xA1\x9D\x3B\xA3\xAC\xA1\x65\xA2\xAE\xA1\x3F\xA3\xB0\xA1\xA8\x9D\xA6\xA2\xAA\x9D\x44\xA3\x25\x4F\x46\xA3\x87\x7F\xB7\x9F\xC0\x9A\xB9\x9F\xF1\x83\x2B\xA1\x6A\x6D\x2D\xA1\x2E\xA3\x2F\xA1\x3E\x94\x0C\xA3\x33\x8E\xDF\x8C\x6C\x9E\xEB\x09\x78\xA2\x13\xA3\xE6\x2B\xF8\x40\x58\xA3\xBC\xA2\xF5\xA2\xA0\xA2\x60\xA3\xA2\xA2\x9D\x6D\xA4\xA2\x9E\x9E\xB2\xA1\xA0\x9E\xB4\xA1\xA2\x9E\xB5\x9F\xD4\x9B\x71\x9B\x03\x54\x73\x9B\x4B\xA3\xB0\xA2\x07\xA3\xB2\xA2\x0A\xA2\x74\xA2\x0B\x90\x8D\x9E\x5A\x86\x33\xA3\xF7\x3C\x7B\xA3\x16\x06\x9C\x5B\x38\xA3\x16\xA3\xDD\x9D\x4B\x8B\xDF\xA2\x47\xA2\x84\xA2\xDA\xA1\x69\xA2\xDC\xA1\x6B\xA2\xDE\xA1\xA3\x84\xE0\xA1\xA7\x84\xE0\x7E\x75\x6B\x16\x65\xB1\x9E\xC1\xA0\xCE\xA1\xEE\xA2\x5F\xA2\x9E\xA3\x7D\xA2\x59\x93\x7F\xA2\x1A\xA2\xD1\x9F\x46\xA2\x88\xA1\x1E\xA2\x85\x9F\x80\x9C\x87\x9F\x17\x9C\x89\x9F\xD4\x98\x8B\x9F\xC8\xA2\x4D\xA1\xCA\xA2\x4F\xA1\xCC\xA2\x96\xA1\xCE\xA2\xB1\xA2\x04\xA1\xB3\xA2\xD2\xA2\x68\x9E\x9A\x98\x99\x9F\xA5\x81\xB0\x94\xEC\xA2\x12\xA3\xB3\xA3\xBA\xA2\x7E\xA3\x39\xA3\xE4\x9C\x80\xA3\xBE\xA2\x78\x9E\xC0\xA2\xE3\x9D\x1F\xA3\xE5\x9D\x21\xA1\xE8\x9E\x23\xA1\xFF\xA2\x71\xA1\x26\xA1\x73\xA1\x28\xA1\x04\xA3\x2A\x9E\x4C\xA3\xBC\x9F\x93\xA3\x09\xA3\x95\xA3\x58\x7B\x57\x9A\x76\xA3\x5A\x9B\xD1\x94\x20\x95\xD3\x94\xD6\xA3\xF1\xA1\xEF\xA2\x50\x41\x7F\xA3\x5E\xA3\x1B\xA2\xBB\xA3\x1C\xA3\xCC\xA0\x28\x92\xCE\xA0\x22\xA3\xFF\xA1\x24\xA3\xD2\xA0\x26\xA3\x93\xA1\x28\xA3\x6E\xA2\x2A\xA3\xD8\xA0\x2C\xA3\xDA\xA0\x72\xA3\x6C\x9F\x14\x95\xF5\x81\xD2\xA3\x30\x90\x27\x0B\x52\x8C\xEB\xA1\x9D\x95\x6B\x7A\xA1\x9F\xA8\x87\x13\xA1\x9B\xA3\x20\x07\x9D\xA3\xD9\xA3\x9F\xA3\x51\x9E\xFE\xA3\xBA\xA3\x1B\xA3\x12\x9C\xBD\xA3\xC1\xA2\xBF\xA3\xC3\xA2\x87\xA2\xC5\xA2\xC3\xA3\x25\xA2\xC5\xA3\x92\xA1\xC7\xA3\x94\xA1\xC9\xA3\x6F\xA2\xCB\xA3\x92\xA3\xCD\xA3\x94\xA3\x50\xA3\x4C\x8C\x1B\x9F\x06\x98\x7D\x8C\x36\x19\x4C\x9F\x0A\x98\x4E\x9F\x48\x0F\xFF\x9A\x2C\x9D\x49\x09\x5D\xA2\xD7\xA3\x57\xA3\xF0\xA2\x59\xA3\xB7\x9E\x7C\x9A\xB9\x9E\x25\xA4\x64\xA2\x1C\xA2\xBF\xA2\x89\xA1\xE0\xA3\xFB\xA1\x20\xA3\xC4\xA2\xD9\x9F\xC6\xA2\x90\xA1\x31\xA4\x02\xA2\x6C\xA2\xCB\xA2\xF6\x93\x0D\xA4\x91\xA2\x0F\xA4\xE9\xA2\x78\x9B\xBF\x9F\xEB\x9F\xF8\x9E\x7D\x9B\x70\x9F\x29\x9B\x72\x9F\x51\x90\x6A\x9E\x23\x9F\x49", "\x95\x3C\xA2\xCC\x69\x55\xA3\x98\x0D\x4A\xA4\xFC\xA3\xDA\xA3\xCF\x9F\x50\xA4\xF6\xA2\x82\xA3\xF8\xA2\x84\x9D\xF6\xA0\x66\x83\x42\xA3\x06\x50\x67\xA3\xCF\x21\x6F\x9B\x01\xA3\xE9\xA3\xB9\xA1\x4A\xA3\xBB\xA1\xED\xA3\x78\xA1\x42\x9F\xC6\x9A\x0A\xA3\x45\x9F\xAA\x9B\x3F\x8D\xE9\x9F\x2C\x96\xB3\x97\x16\x36\xE2\x8C\x19\xA4\xF5\xA3\xE5\x8C\x71\xA4\xD9\xA2\x1D\x65\xDB\xA2\x23\xA4\x56\x9F\x9F\xA2\xDD\xA3\xBD\x9E\xDF\xA3\x7A\x9E\xC2\xA2\xD7\x9F\x58\xA4\x49\xA1\x5A\xA4\x00\xA2\x5C\xA4\x27\xA2\x5E\xA4\xC8\xA3\x60\xA4\x01\xA1\x2B\xA3\xCF\xA2\x2D\xA3\xD1\xA2\x2F\xA3\xFF\x92\xC0\x9F\x22\x9F\xEE\x8D\xA2\x9F\x7F\x9B\x9B\x95\x97\xA4\x82\x9B\x73\x90\xC7\x9F\xA0\x95\xA4\xA1\x1F\xA4\xB6\x03\x46\x33\x0D\x2B\xFD\xA3\xDE\xA2\x1A\xA3\x83\xA2\x9D\x8B\x85\xA2\x57\xA4\x2D\xA4\x59\xA4\x2F\xA4\x8A\xA2\xAB\xA4\x8C\xA2\xAD\xA4\x34\xA4\xAF\xA4\xAF\xA2\x02\xA1\xCC\xA3\xD0\xA2\xCE\xA3\xB5\xA4\xD0\xA3\xF3\xA3\x5A\x8C\x96\x7E\xB7\xA4\x5F\x7B\x80\x90\xF2\x5E\x03\xA0\x84\x90\xDE\x87\x52\x8E\xE4\xA4\x25\x7D\x06\x9C\xFD\x9F\x52\x97\xCC\x69\xBA\x6F\x6C\x99\x3B\x67\x50\x4A\x03\xA0\xA2\x90\xB2\xA0\x20\x6A\x08\xA0\x71\x6C\x31\x91\xB9\x6F\x35\x65\xD5\x5B\x2B\x0C\x34\x86\x10\xA0\x48\xA0\xED\x41\x8A\x9B\x7B\x4E\x14\x28\x4C\xA0\xF2\x69\xB3\x90\x82\xA0\x50\xA0\x84\xA0\x92\xA0\x79\xA0\x1A\x71\x55\xA0\x8D\x94\xB9\x69\xEF\xA4\x12\x9A\x49\x47\x04\xA5\x72\xA0\x83\x06\x25\xA0\x18\xA0\xD1\x74\x1A\xA0\x0E\x8F\x09\x75\x8D\x63\x2A\xA0\x15\x90\x01\xA5\x6A\x9A\x89\x73\x5D\x28\xCA\x90\x28\x0D\xC4\x68\x26\xA0\x1A\xA5\xDA\x90\x6E\x8D\x9B\x10\x3A\xA0\x00\xA5\x39\x4B\xFB\xA4\xF1\xA4\xD3\x5B\x3E\xA0\x95\x8D\xA5\x8D\x0F\x8F\x0D\xA2\x77\xA0\xB7\x90\xAF\x8E\x99\x8E\x6D\xA0\x9F\x93\x71\x6D\x11\xA5\x1E\x9A\x13\xA5\x23\xA5\x7F\xA0\x4D\xA0\x35\x72\x08\xA5\xF1\x90\x0A\xA5\x36\xA0\xC4\x74\xE8\x90\xC7\x90\x3E\xA5\x2B\x9A\x30\xA5\xCC\x5B\x79\x00\xEE\x90\xDC\x74\xFF\x68\x91\xA0\x48\xA5\xB8\x90\x77\x70\x4B\xA5\x2F\xA5\x40\xA5\x50\x4A\xBE\x90\xBD\x8D\xFE\x6A\x54\xA5\x78\xA0\x49\xA5\x8E\x10\xEF\x74\x1F\xA5\x2E\xA5\x02\xA5\x01\x56\x14\xA5\xFA\x90\x0C\x6B\x75\x71\x5F\xA5\x38\xA5\x6F\x73\x13\x6B\x88\xA0\x86\x8F\x3D\xA5\x59\xA5\x73\x64\x5B\xA5\x42\xA5\x03\x75\x16\x91\x4F\xA0\x46\xA5\x7A\x8D\x85\xA0\x0C\xA5\x3C\x0F\xD9\x8E\xD2\x8F\x33\x67\x21\xA5\xFC\x3E\x68\xA5\x5A\xA0\x90\xA0\x27\xA5\x37\xA5\x06\xA0\x2A\xA5\x98\x71\x84\x72\x1C\x75\x5C\x0A\x4C\xA5\x61\x9A\x4E\xA5\x1F\x1E\x2E\x91\x9C\xA0\xA7\x90\xEE\xA4\x73\xA5\x22\xA5\xF2\xA4\x34\x86\xF0\x8D\x95\xA5\x8E\xA5\x97\xA5\x83\xA5\x5D\x28\xF4\x8D\x3B\x91\xAC\x90\xF7\x8D\x9D\xA5\x66\xA5\xBA\x97\x14\x28\xAD\xA0\x59\x69\x9E\x72\xD5\x70\x1B\xA0\x7D\x74\xA1\x6F\x44\x0F\x10\x66\xFB\x36\x27\x8E\x44\x0F\x77\x7B\x38\x0F\xE0\x99\xBE\x6F\xF0\xA4\x5A\xA5\xD3\x5B\xD6\x7C\xFA\x8E\x05\x7D\x9B\x3B\x8E\x10\xCA\x6F\x85\x7B\x27\x7C\xD6\x47\xA6\xA5\x73\x38\x5D\x28\xBC\xA5\xAC\x7C\x5F\x7C\x11\x96\x83\x02\x88\x7C\xF7\x7C\x8A\x7C\x79\x7C\x7E\x4B\xF9\x1C\xDA\x7C\x64\x00\x31\xA0\x3B\x7C\x72\x88\xCC\x7B\x3E\x7C\xA3\x7B\x10\x41\xA5\x7B\xA7\x7B\x0E\x9A\xB8\xA5\x12\xA5\x74\xA5\xBB\xA5\x84\x7C\xC9\xA5\x86\x7C\xCB\xA5\x91\x7B\xF6\x7C\x1D\x65\xF8\x7C\xB7\x7B\xE8\x65\x52\x93\x83\x1D\xBC\x7B\xE6\x65\xDF\xA5\x3F\xA5\xE1\xA5\x4F\xA5\xC8\xA5\x1E\x65\xB1\x7B\xC6\x29\xE8\xA5\x0F\x96\xCF\xA5\x0D\x7D\x12\x96\x98\x7B\xAA\x9C\x04\x7F\xCD\x7B\x3D\x01\xCF\x7B\x10\x41\xD1\x7B\x1E\x02\xB9\x9D\x64\x9A\xA2\x95\xCC\x69\xF1\xA5\x4D\xA5\xBA\xA5\xF4\xA5\xE3\xA5\xF6\xA5\xAD\x7C\xB2\x7B\xB0\x7C\x89\x7C\xB2\x7C\xE5\x7B\xB4\x7C\xFD\xA5\xE8\x7B\x9B\xA0\x98\x6D\xDE\xA5\x9E\xA5\x03\xA5\xC7\xA5\x0F\xA6\x1D\x65\xF7\xA5\xF5\x7C\xD6\x9E\x9D\x7C\x98\x33\xC0\x7C\xF9\x7C\xDA\x7A\xFF\x00\x91\x99\x1C\xA6\xC5\xA5\xE7\x7C\x0E\xA6\x95\x7C\x04\x8F\xD3\x64\x87\x7C\xF9\xA5\x1B\x65\xEA\xA5\xA6\x5C\x70\x80\xCE\x99\xEF\x9F\x33\x93\x0A\xA6\x1D\xA6\x67\xA5\x1F\xA6\x30\xA6\xBD\xA5\x27\xA6\xF8\xA5\x13\xA6\xCE\xA5\x15\xA6\x52\x7C\x18\xA6\x86\x96\x8D\x63\x25\x7C\x86\x7B\xC3\x73\x4B\x39\x3D\xA6\xA7\xA5\x3F\xA6\x5D\x7C\xE4\xA5\xD8\x7C\x33\xA6\x44\xA6\xE9\xA5\xFB\xA5\x17\xA6\x7A\x7C\x80\x0A\xD3\xA5\x39\x7C\xC8\x03\xD6\xA5\xBD\x93\x89\x0C\x01\xA6\x42\x70\x28\x0D\x40\x7C\x3D\x0C\x42\x7C\x3C\x0F\x44\x7C\x2C\xA6\x82\xA5\x1E\xA6\x50\x4A\xF5\xA5\x21\xA6\x11", "\xA6\x43\xA6\x08\x7D\x25\xA6\x99\x3B\x78\x7C\xFC\xA5\x5A\xA6\x54\x7C\x3C\x0F\x56\x7C\x7F\x12\x6A\xA6\x34\x9B\x98\xA5\xE2\xA5\x40\xA6\x53\xA6\xF3\x7C\x2F\x7C\x72\xA6\x76\x7C\x9E\x7C\x0C\x7D\x59\xA6\xD1\xA5\x7B\x7C\x16\x65\x68\x7C\x7C\xA6\x3A\x9A\xF3\xA5\x1F\x1E\x6E\xA6\x1C\x65\x22\xA6\x07\x7D\x03\x01\x09\x7D\x14\xA6\x0B\x7D\xB3\x7C\x65\x7C\xB5\x7C\xCA\x6F\x7D\x7C\x8D\xA6\xD7\x9A\x8F\xA6\x2B\x0C\x91\xA6\xC7\x7A\x70\xA6\x23\xA6\x84\xA6\x0A\x7D\x86\xA6\x99\xA6\x8A\x40\x8D\x7C\x27\x01\x8F\x7C\x2D\xA5\xC5\x4A\x2D\xA6\xCF\x1E\x51\xA6\x03\x7D\x31\xA6\x72\x7C\xE6\xA5\x22\x8B\x0B\x96\x97\xA6\xA8\xA6\x06\x7D\xB5\x7C\xA3\x7C\xF5\x53\x9E\xA6\x06\x9B\xA0\xA6\x43\x19\xA2\xA6\x28\x9B\xE5\xA5\xA0\x7C\xF1\x05\xCD\xA5\x57\xA6\x46\xA6\x8B\x7C\x8A\xA6\x3C\x0F\xB7\x7C\xEF\xA5\xB9\x69\x0B\xA6\x90\xA5\x0D\xA6\x90\xA6\x20\xA6\x92\xA6\xA4\xA6\x98\x0B\xD3\xA5\xC5\x7C\x49\x01\x63\x00\xE0\x7C\x3E\x01\xBB\x9B\xE4\x7C\x5F\x74\x4E\x63\xE3\x5C\x62\x09\x16\x65\xD0\x7C\xCF\xA6\x42\x6A\xD1\xA6\x60\x9B\x91\xA5\xA1\xA6\xD5\xA6\xA3\xA6\xCA\xA5\xC6\xA6\xE5\x0E\xA5\x6A\x21\x09\xDC\x7C\x3F\x2C\x13\x02\xDD\xA6\xA6\x64\x4E\xA4\x64\x11\xE0\xA6\xF9\x6E\xE2\xA6\xE6\x64\x2B\x69\xEA\x7C\xBF\xA6\xAC\x9A\xD3\xA6\xEC\xA6\x80\xA6\x10\xA6\xEF\xA6\xC1\x7C\xC7\xA6\x34\xA6\x1A\x65\x36\xA6\x22\x7C\x8F\x79\x29\x50\xB5\x00\x07\x9A\xC4\xA5\x6B\xA6\x3E\xA6\x99\xA5\x59\x8E\xFC\x7C\x01\xA7\xB9\xA5\xC1\xA6\xC8\x67\xED\xA6\xC4\xA6\x54\xA6\xB6\xA6\xAA\x8A\x96\xA6\x45\xA6\x98\xA6\x16\xA6\x9A\xA6\x48\xA6\xFD\x7B\x11\x7C\x1F\x63\xDE\x8F\x1F\x65\xA4\x64\x3B\x5C\xF8\xA6\xCD\x72\xE4\xA6\x28\x8E\x06\x01\x87\x53\x6F\x7B\x00\x00\x33\xA7\x89\xA0\x1C\x65\x2C\xA7\x32\x62\xDE\xA6\x1C\x6D\xE9\x36\x2F\x09\x36\xA7\x58\x9A\xE9\x36\x78\x6B\x91\x0E\x44\x62\x3A\x0F\x34\x62\xFA\x9F\x34\x86\xD3\x8F\xA3\xA1\x42\x6A\xC8\x6F\x3C\x8D\x5E\x29\xC7\xA4\x64\x9B\xA2\xA3\xBC\xA3\x1D\xA3\x08\x9F\xE1\xA3\x0A\x9F\xE3\xA3\x5F\x9F\xE5\xA3\x39\x9F\x00\xA3\x3B\x9F\x02\xA3\xED\x9D\xEB\xA3\x67\x9F\xBC\xA1\x92\x9D\x8C\xA4\x78\x9B\x06\xA1\x2C\x82\x93\x90\x63\x89\x1F\x83\x46\x88\x21\x83\x32\xA0\xA2\x76\xE5\x9B\xA2\xA1\xB4\x8B\x8F\x1E\xBB\x7C\x4E\xA7\x77\xA4\x5D\xA3\xC8\xA4\x3C\xA3\x7B\xA4\x3E\xA3\xF9\xA2\x63\xA3\x6C\xA1\x65\xA3\x5A\x9E\x82\xA4\x3B\x4E\x69\xA3\x44\x84\x5D\xA7\xEE\x9E\x29\xA1\xFB\x97\x6F\xA3\x9D\x6D\x71\xA3\x05\xA1\xFF\xA5\x18\x83\x5F\x92\xDE\x9B\x20\x9D\xFF\x9B\x9A\x91\x01\x9C\x83\x96\x6C\xA7\x29\x6D\x49\xA6\x8E\x10\x07\x9C\xD5\xA3\x06\x01\x4C\xA7\xD9\x8F\xF9\x42\xB3\x33\x4F\xA7\xDE\x9D\x51\xA7\x01\xA4\xE1\xA2\x03\xA4\xE3\xA2\x1C\x8C\xE5\xA2\x34\x8B\xE7\xA2\xA5\x88\x64\xA4\x94\x9D\x7B\xA1\x31\xA1\xF5\x04\x33\xA1\xC6\x91\x63\x7E\xBD\xA4\xF6\x9A\xB4\x96\xEC\x85\x0A\x99\x9B\xA7\x24\x90\x03\x2C\x9E\xA7\x74\xA7\xC8\xA0\xAA\x9F\x5F\xA3\x52\xA4\xDE\xA3\x54\xA4\xA4\xA4\x2B\xA4\xA6\xA4\xCE\xA4\xA8\xA4\xD0\xA4\xC7\xA2\x25\x9E\x72\xA1\xFE\xA0\xAD\xA2\x00\xA1\xD7\xA4\xB1\xA4\xD9\xA4\xB3\xA4\xDB\xA4\x73\xA3\xCF\x96\x8F\x7E\xA8\x83\x7E\x8C\x92\x7E\x5B\xA1\x3D\x76\xBC\x6F\x88\x8C\x5C\xA2\x71\x6D\xB8\xA7\xAD\x94\xF4\x52\x73\xA7\x9E\xA4\x43\xA2\x76\xA7\xBF\xA7\x00\xA4\x28\xA4\x53\xA7\x56\x9E\x1F\xA1\xA5\xA2\x87\xA3\xA7\xA2\x0D\x9F\x39\x99\x81\xA7\x73\x86\x6B\xA3\xEB\x9A\x5F\xA7\x2A\xA1\x61\xA7\x69\x9F\xBE\xA1\x1E\x80\x7B\xA1\xF7\xA4\x5B\x8F\x18\x91\x5C\x0A\xE0\xA7\xCF\x94\xE2\xA7\xBB\xA7\xE4\xA7\x62\xA2\x79\xA4\x81\xA3\xC0\xA7\xA2\xA4\xC2\xA7\xBF\x9E\xA5\xA4\x21\xA2\xC1\xA3\x23\xA2\xC8\xA7\x5B\xA4\xCA\xA7\xE8\xA3\xCC\xA7\x49\xA3\xCE\xA7\x90\xA3\xD8\xA4\x38\xA4\xDA\xA4\x3A\xA4\xCF\xA3\x57\xA1\x61\x8F\x38\x89\x6F\xA7\x8B\xA7\xCC\x69\x01\xA8\xC1\x95\x1F\x57\xE3\xA7\xB6\xA3\xFD\x94\xA0\xA4\x80\x95\x44\xA1\x1E\xA3\x56\xA4\xE2\xA3\x21\xA3\xC3\x9E\x23\xA3\xFB\xA0\x25\xA3\xFD\xA0\x27\xA3\xFF\xA0\x29\xA3\xB0\xA4\x0E\xA4\xB2\xA4\x10\xA4\x8A\xA7\xD7\xA5\x83\x0E\xAC\x9C\x3E\x95\xDF\xA0\x7B\x06\xC7\xA1\xB2\x71\xC9\xA1\x9C\xA1\xEC\x76\x9A\xA4\xC7\x6F\x72\xA7\x04\xA8\x28\xA8\xBF\x96\xD4\xA1\x19\xA3\x77\xA7\x09\xA8\x92\x9B\xEA\xA7\xE4\x9E\xEC\xA7\x86\xA3\x57\xA7\x37\x9F\x59\xA7\x61\x9F\xE7\xA3\xB7\xA1\x86\xA4\x03\xA3\x88\xA4\x05\xA3\x91\xA3\x4D\xA3\xEF\xA3\x4F\xA3\x1D\xA8\x67\xA7\x90\xA4\xAC\x84\xD6\x9C\x20\x77\x54\xA2\xB7\x8C\x26\x9D\x57\xA2\x2B", "\x9C\x92\xA4\xD0\x9A\x48\x0F\xEE\xA1\xB7\xA2\x71\xA7\x03\x82\x27\xA8\x5A\xA3\x2C\x9F\x5C\xA3\xBD\xA7\xD5\xA1\x26\xA4\xCA\xA4\x16\x8C\xCC\xA4\x2F\xA8\xA7\xA4\x05\xA4\xA9\xA4\x07\xA4\x8B\xA2\x09\xA4\x33\xA4\x0B\xA4\x35\xA4\x61\xA4\x37\xA4\x63\xA8\x39\xA4\xF0\xA3\x3B\xA4\x39\x92\xAB\x97\x0C\x05\x0F\xA2\x42\xA4\x11\xA2\x71\x0F\x13\xA2\xB6\x96\xFB\x69\x24\xA8\x9B\x98\x26\xA8\x4C\xA8\x79\xA8\x7D\x9F\xDE\x9E\x84\xA1\x81\xA2\xA1\xA7\xE9\xA7\x02\xA4\x63\x93\x04\xA4\x31\xA8\x06\xA4\x33\xA8\x08\xA4\x35\xA8\x0A\xA4\x37\xA8\x0C\xA4\x39\xA8\x62\xA4\x3B\xA8\xAB\xA7\x22\x82\x30\xA2\xD5\x9C\x6D\x0C\x34\xA2\xE7\xA1\x36\xA2\x53\x9D\xEA\xA1\x10\xA2\x72\x90\x3B\xA2\x1C\xA4\x99\x95\xE6\x65\x9C\xA8\x5C\x81\x78\xA8\x4D\xA4\xBC\x9C\x7F\x9D\xDC\xA3\x2B\xA8\xA3\xA4\x0C\xA8\xC4\xA7\x0E\xA8\xA9\xA8\x22\xA1\x32\xA8\x70\xA1\x34\xA8\xCB\xA7\x36\xA8\xCD\xA7\x38\xA8\xCF\xA7\x3A\xA8\xD1\xA7\x3C\xA8\xD3\xA7\x12\xA4\xA0\x86\x31\xA2\xDC\x84\x4F\x9D\x24\x8A\x51\x9D\xE8\xA1\x8E\x92\xBE\xA8\x96\xA8\xC0\xA8\x8E\x10\x5B\xA2\xD5\x7F\xB9\x69\xC5\xA8\x1C\x6D\xC7\xA8\x11\x99\xAF\x9A\xA2\xA8\x18\xA3\xA4\xA8\xC9\xA4\xC5\x9D\x01\x9E\xF4\x9B\xDB\xA1\xC9\x9D\x4C\xA2\xA6\x9C\x4E\xA2\xA8\x9C\x63\x99\xBD\x7E\x2F\x93\xFB\x7F\x99\xA3\x4A\x2C\x77\xA8\x9F\xA8\xC8\xA8\x95\x9E\x2D\x9F\x65\xA1\x52\xA8\xF2\xA0\x98\x96\x61\xA3\x7A\xA7\x56\xA8\xE6\x9E\x58\xA8\xB2\x9F\x5A\xA8\xB4\x9F\x5B\xA7\xB6\x9F\x83\xA7\x3D\x9F\x85\xA7\xDB\x98\x87\xA7\xBA\x6D\x89\xA7\xDE\xA8\xE6\x9F\x30\xA3\xED\xA5\x45\x53\x05\xA9\x88\x39\x07\xA9\x04\x42\x9F\xA7\xA1\xA3\xF7\xA8\x3E\x9E\xF9\xA8\xC7\x9D\x41\x9E\xE4\xA2\xCA\x9D\xE6\xA2\x45\x9E\xE8\xA2\x47\x9E\x20\x80\x77\x98\x94\x92\xEF\xA8\x53\x6E\xF1\xA8\x09\x9B\x93\x96\xB8\xA3\x2A\xA8\x3D\x96\xCD\xA8\xFA\xA1\x0D\xA8\x86\xA2\x0F\xA8\x88\xA2\x11\xA8\xAA\xA4\x13\xA8\x5D\xA8\x15\xA8\xEA\xA3\x60\xA8\xEC\xA3\x62\xA8\xEE\xA3\x8F\xA8\x65\xA8\xDC\xA4\x3E\x95\xD4\xA2\xCA\x7F\x9D\x98\x93\x6D\xDA\x78\x00\xA8\x4B\xA8\x29\xA9\xBC\xA7\xF0\xA0\xF6\xA8\x51\xA8\xE8\xA7\x1D\xA2\x54\xA8\xAE\x9F\x12\xA9\xB0\x9F\x14\xA9\xB3\xA1\x16\xA9\xB5\xA1\x5C\xA8\x85\xA4\x4C\xA9\x87\xA4\x17\xA8\x89\xA4\x50\xA9\x8B\xA4\x4E\xA3\x54\x9A\xEB\xA2\x75\xA8\x9A\xA7\x5C\xA9\x12\x43\x2A\xA9\xBF\x8B\xA5\xA8\x63\xA9\xA7\xA8\x14\x9B\xA5\xA7\xB7\x91\xA7\xA7\x20\x8C\xD6\xA4\x18\xA8\xD0\xA7\x1A\xA8\xD2\xA7\x1C\xA8\x54\xA9\xBF\x95\xDE\xA4\xAF\xA0\x98\xA4\x13\x9E\xC2\x85\x26\xA9\x09\x42\x28\xA9\x7A\xA9\x5E\xA9\x19\xA1\x60\xA9\xE7\xA7\x27\xA4\x7E\xA9\xA3\xA7\xA8\xA8\x81\xA9\xE0\x91\x83\xA9\x8D\x91\xA9\xA7\x75\x8A\xB5\xA8\x7A\xA1\x8E\xA4\x31\xA3\xFF\x93\x92\xA9\x3A\xA9\xC6\x85\x3C\xA9\x6E\x99\x2C\x99\x0B\xA9\xA3\xA8\x0D\xA9\x1B\xA1\x0F\xA9\x83\xA3\xBA\x6D\x85\xA3\x13\xA9\x30\xA8\xD2\xA8\xAB\xA8\xD4\xA8\xAD\xA8\xD6\xA8\xAF\xA8\xD8\xA8\xB1\xA8\xDA\xA8\xB3\xA8\xDC\xA8\xA4\xA9\xBF\xA1\x44\x9F\x22\x99\x06\x01\xFC\x8F\x70\xA7\x78\xA9\x94\xA9\x53\x0C\x7B\xA9\xFD\x91\x2C\xA9\xCB\xA0\x9C\xA9\x80\xA9\x30\xA9\xA6\xA7\x32\xA9\xA8\xA7\x34\xA9\xAA\xA7\x36\xA9\x5E\x8F\xC7\x6D\xA4\x8A\xAE\x8C\x78\xA3\xDA\x02\x0E\x93\xAA\xA9\x7A\x8C\xAC\xA9\x62\x9B\x24\xA4\xE6\xA7\xFF\xA3\x9A\xA9\x53\xA4\x29\xA4\x55\xA4\x44\xA9\xCD\xA4\x46\xA9\x2E\xA4\x19\x9C\x86\xA8\xD2\xA4\x88\xA8\xD4\xA4\x8A\xA8\x85\xA9\x71\xA9\x19\xA8\x8E\xA8\x1B\xA8\x90\xA8\x66\xA8\x51\xA3\x8D\x63\x67\x99\xA9\xA9\x79\xA9\xCD\xA9\x96\xA9\x40\xA1\x62\xA9\xB8\x94\x31\x99\x07\x9F\xEB\xA7\x55\xA7\x20\xA1\xB8\xA9\xE4\xA3\xD3\xA8\xE6\xA3\xD5\xA8\x14\xA8\xD7\xA8\x16\xA8\xD9\xA8\x86\xA9\xDB\xA8\x88\xA9\xDD\xA8\x8A\xA9\xD4\xA7\xD4\x7D\xAF\x9E\x8E\x10\xB0\xA3\x4A\xA7\xDF\xA7\x02\xAA\x93\x1E\xCE\xA9\x4A\x94\xD0\xA9\xF8\xA1\x7F\xA9\x96\x9B\xD1\xA8\x0E\xAA\xBA\xA9\x10\xAA\xBC\xA9\x12\xAA\xBE\xA9\x14\xAA\xC0\xA9\x16\xAA\xC2\xA9\x18\xAA\xC4\xA9\xFB\xA7\x8E\xA4\x56\xA9\x14\x88\xD5\x9E\x06\x01\xD7\x9E\xE9\xA0\x9B\xA8\x22\xAA\x32\x06\x24\xAA\x52\x95\x82\xA2\xF8\xA8\x67\xA2\xFA\xA8\xA6\xA3\xFC\xA8\xA8\xA3\x4D\xA2\xAA\xA3\x4F\xA2\xAC\xA3\x00\x90\x20\x96\xE1\xA7\xEC\xA1\xF7\x65\x49\xA8\x76\xA8\x27\x87\xE4\xA9\x7D\x85\xF3\xA2\xDB\xA3\x07\xA8\xA1\xA4\x53\xA8\x28\xAA\x81\x9C\x9E\xA9\x55\x94\xA0\xA9\xE4\x91\xA2\xA9\x98\x8A\xDA\xA9\x49\x90\x5A\xA0\x15\xA4\x63\x7A\x1F\x9F\xF2\x86\x81\x9B\x0E\xA3\x8E\x10\x25", "\x9F\x75\x9A\x23\xA8\x40\xAA\xEE\x05\x42\xAA\xA9\x95\x7D\xA9\xEA\xA9\x64\xA9\x1E\xA1\x0B\xAA\xED\xA7\x68\xA9\x88\xA3\x6A\xA9\x8A\xA3\x18\xA9\x8C\xA3\xF4\xA7\x72\x9B\x6D\xA3\xCF\x21\xBB\x9F\x73\xA9\x64\xA8\x94\xA2\xF1\xA3\x06\x6E\x3D\xA4\x6C\xA8\xD6\x0E\x19\x95\x4B\x9F\x1F\x87\xE9\xA8\x1D\x95\x44\xA4\x54\xAA\xCB\xA9\x56\xAA\x08\xA9\xF2\xA8\xB8\x9E\xCA\xA8\x5B\xAA\xCC\xA8\x0B\xA8\x43\xA9\xCF\xA8\x45\xA9\x2A\xAA\x58\xA7\x0F\xAA\x5A\xA7\x6C\xA9\x5C\xA7\x5E\xA8\x5E\xA7\x4E\xA9\x60\xA7\x8A\xA4\xBD\xA1\x63\xA7\xAC\xA7\x8E\xA4\xE1\xA4\xD3\x9E\x0E\x8D\x8F\x8E\x71\x9F\xD3\x02\x6D\xA4\xB3\xAA\x9C\x7A\x54\x90\xC2\xA8\xC8\x95\xEE\xA8\x73\xAA\xDD\x05\x75\xAA\x1D\x9E\x77\xAA\xC1\xA7\xEB\xA9\xC3\xA7\x81\xA8\x56\xA7\x0D\xAA\xA4\xAA\x2C\xAA\xA6\xAA\x11\xAA\x4B\xA9\x13\xAA\x4D\xA9\x70\xA9\x61\xA8\xF9\xA9\x51\xA9\xFB\xA9\x53\xA9\x1B\xAA\x97\x9F\xD6\x97\x4E\x8C\xC6\x8A\x52\x9D\x1C\x6F\x96\xA4\xBF\xA8\x94\xAA\x8D\x63\xE6\x8C\xF7\xA3\x82\x90\x72\xAA\xCC\xA9\x23\xAA\x04\xAA\x0C\xA9\x06\xAA\x99\x9E\x31\x9F\x7C\xA4\x33\x9F\x7E\xA4\xF7\x23\x5E\x9F\x59\xA8\xA5\xAA\x5B\xA8\xCD\xAA\x6D\xA9\xCF\xAA\x6F\xA9\x15\xAA\xF8\xA9\x87\xA9\xFA\xA9\x89\xA9\xFC\xA9\x8B\xA9\xE1\x6C\xB2\xAA\x68\xA4\x36\xA1\x1D\xA4\x52\x09\x70\x90\xDF\xAA\x43\x90\xBF\x82\x09\x01\xB8\x99\x51\x6F\xA9\x67\xE2\xA9\xAD\x8C\x57\xAA\x9A\x9C\x7B\xA8\x5F\xA9\xB1\xA9\x44\xAA\x2D\xA9\x46\xAA\x2F\xA9\xFB\xA8\x42\x9E\xD6\xA9\x84\xA9\x64\xAA\x38\x8B\x66\xAA\x2A\x90\x75\xA3\xDF\xA4\x6C\x6C\x01\xAB\xFB\x8E\xED\x9F\xFD\x8E\x70\xA8\x79\x98\xC9\x95\xFF\x5E\xB1\x9B\xE8\xA4\xEE\x9F\xFB\x9F\x8D\x63\x10\x66\x4E\x5D\x47\xA7\x8F\x6B\xCA\x6F\x99\x71\xCD\x6F\xF7\x8D\x58\xA1\x15\x6E\xB3\x64\xF9\x95\xEE\x87\xFB\x95\xDB\x6F\xAE\xA9\x60\x08\x4A\x29\xDF\x6F\xDE\x71\x67\x62\xEA\x6F\x0D\x88\xF3\x20\xE6\x6F\x80\x17\xE8\x6F\x6B\x29\xEA\x6F\xFF\x00\x99\x71\x80\x5D\x00\x8E\x44\x0F\xE1\x76\xD3\x3B\x46\x7C\x47\xAB\xCD\x23\x49\xAB\xFA\x0B\x1B\x11\xBA\x37\x6C\x62\x63\xA6\x8D\x33\x3F\xAB\x0A\x9B\x41\xAB\x65\x62\xFC\x70\xE0\x28\xEA\x6F\x39\xAB\x2C\x84\x3B\xAB\x1B\x96\x08\x61\x15\x42\x56\x29\x39\x75\x51\x83\xBB\xA3\xEB\x99\x94\x17\xC3\xA4\x73\x38\xE9\x42\xF3\xA4\x56\x8E\xAD\xA5\xDC\x68\xF7\xA4\x1B\x74\xFB\x72\xB9\x69\x74\x73\x3C\xA1\x7B\x73\xF7\x72\xE1\x20\xFE\xA4\xC7\x90\x7D\xAB\xA6\xA1\x7F\xAB\x98\x62\xF4\x1E\x05\xA5\xB5\x05\x07\xA5\x40\xA0\x36\xA5\x51\xA0\x0B\xA5\x61\xA5\x71\x0F\x1E\xA0\x64\xA5\x2A\x50\x72\xAB\x78\x5C\x7C\x73\xBB\x1E\x5C\xA5\x5E\x66\x17\xA5\x79\xA5\x18\x91\x47\xA5\x60\xA5\x56\xA5\xC6\x90\x70\xA5\x34\x93\x42\x6A\x84\xAB\x3F\xA2\x86\xAB\x75\x5C\xA8\x29\x24\xA5\x7C\x1D\x26\xA5\x18\xA5\xEB\x74\x77\xAB\x38\xA0\x71\x0F\x2C\xA5\x93\xAB\xA5\xAB\x7A\xA2\xA7\xAB\x81\x5C\xB1\x01\x32\xA5\x63\x73\x44\xA5\x8C\xAB\xFE\x90\x88\xA5\xF5\xA4\x45\xA0\xFF\x00\x47\xA0\xB3\xAB\x95\xAB\xE8\x42\xC1\x64\xB8\xAB\x76\xA5\xB5\x05\x4E\xA0\x45\xA5\x9D\xAB\x7B\xA5\x8F\xAB\xA0\xAB\x4A\xA5\xA2\xAB\x11\x72\xA4\xAB\xC4\xAB\xF6\x72\x87\xAB\xEC\x06\x51\xA5\xB1\x8F\xDD\x74\x87\xA5\x8E\xAB\x55\xA5\x39\xA5\xB8\x8D\xD1\xAB\xCB\x69\xB4\xAB\x9C\xA2\xB6\xAB\x41\x39\xDF\x03\x99\xAB\xB2\x66\xBE\x8D\x6C\xA5\x89\xA5\xB7\x8D\x89\x70\x83\xAB\xD4\xAB\x79\x66\xE6\xAB\x15\xA5\xCB\x04\x91\x70\xEA\xAB\xBF\xAB\x7A\xA0\xEE\xAB\x49\xA4\x7C\xA3\xD5\xAB\xA8\xAB\x88\xAB\xC8\xAB\x4A\x07\xD3\x8E\xDB\xAB\x9E\xAB\x6D\xA5\x01\x91\x8A\x71\xF8\xAB\xFA\xA3\x78\x66\xE9\x42\x89\xAB\x90\x01\xB1\x70\xF5\xAB\xAF\xAB\xC0\xAB\x29\x91\x9D\xA0\xFB\x69\xE2\xAB\x36\xA3\xFA\xAB\xF0\xAB\x9A\x9F\x27\xA7\xE7\x8D\xBD\x70\x8D\xA5\x1F\x67\xEF\xAB\x74\xAB\x9A\xA5\x5E\x6F\xEA\x8D\x71\x6D\x13\xAC\x56\xA3\x15\xAC\x1E\xAC\x3A\x91\xFA\x9E\x60\x8D\x3F\x92\xCC\x69\x23\xAC\x74\xA4\x25\xAC\xC6\xAB\xDF\x03\xA9\xA5\x99\x6B\xAB\xA5\x5A\x6B\x1B\xA5\x38\x75\xE2\x87\x16\x65\x3C\x06\x5A\x53\x33\xAB\xAF\xA5\x0F\xA1\x29\x94\x70\xAB\xE1\x37\x2A\x75\xAD\x9B\x02\x05\x76\xAB\x35\xAC\x33\xA0\x29\xA6\x5B\x8E\xA5\x76\x71\x6D\x74\x74\x8A\x74\xBA\x66\xAB\x90\x10\x91\xB9\x69\x4B\xAC\xF4\x79\xF9\x6A\x67\xA0\x7C\x97\x5F\x05\x17\xA0\x9C\xAB\x24\x91\xBE\xAB\x0E\xAC\xA4\x69\xC7\x90\x51\xAC\xEF\x7F\x53\xAC\x8E\xA0\x50\x72\xA5\x74\xC0\x90\x32\x70\x01\xAC\xCD\xAB\xDD\xAB\x6E\xA5\x0F\x72\xE0\xAB\xA9\x67\x5E\xAC\xF4\x7F\x60\xAC\x73", "\x8F\x41\x70\x31\xA0\x6A\xA0\x93\xA0\x8A\x8E\x3B\xA5\x56\xA0\x4A\xAC\xFF\x74\x56\x90\x01\x75\x3F\xA0\xF1\x70\x8D\xAB\x02\xAC\xEB\xAB\xED\x74\x8D\x63\xC2\xAB\x80\xA5\xBD\x1C\x79\xAC\x67\x90\x41\x70\x62\x70\x34\xA5\xFD\x90\x51\x71\x27\xA0\xD3\x8D\x8E\x10\xE9\x90\x4D\x91\xFB\x69\x6D\xAC\x1C\x82\x6F\xAC\x20\x8E\xFB\x6A\xEF\x90\x58\xAC\x19\xA0\x5A\xAC\x45\xAC\xF5\x90\x5D\xAC\x86\xAC\xA6\x65\x51\x72\x5E\xA5\x66\xAC\x88\x8D\x0B\x91\x90\xAB\xFF\x00\x63\xA5\x84\xAC\x07\x67\x9F\xAC\x7F\x70\x6A\xA5\x24\x69\x0D\xAC\x9C\xAC\x0D\x91\x2C\x69\x9E\xAC\xE5\x74\x61\xAC\xF4\x71\x15\x91\x00\xAC\xAD\xAB\xDE\x8D\x5B\xAC\xD3\x65\xB3\xAC\x1F\x74\x0A\xAC\x51\x01\x0C\xAC\xA3\xAC\x6D\x8E\x7C\xA5\xA6\xAC\x10\xAC\x9C\xA5\x62\x73\x1F\x74\x93\xA5\x1A\xAC\x34\xA7\x5C\x0A\x93\xAC\x70\x84\xE0\x65\xA1\xA0\x7A\xAC\xA3\xA0\xAA\xAC\x1E\x75\x6B\x6A\xB5\xA0\x29\xAC\x3B\xA6\xCD\xAC\x62\x74\xB5\xAC\x32\x75\xFF\x73\x9C\xA7\xFD\x8D\x29\xA5\x7D\xAC\x19\x81\x81\x63\x21\xA8\x3E\xA8\xB9\x69\x18\x9A\x81\xA6\x87\x90\xE0\x3A\xC1\xAA\xC9\xA0\x26\xAA\xE0\xA2\x2E\xA9\x40\x9E\x19\xAB\x31\xA9\xFD\xA8\x44\x9E\xFF\xA8\x46\x9E\xFB\x9B\x22\xA8\x5E\x89\x40\xA8\x67\xA8\x3F\x0F\x21\x8F\x39\x5F\x23\x8F\x6F\x8F\x48\x0F\xE6\x9B\x77\xA9\x03\x01\xE8\xAC\x06\xA7\x67\x8E\xF2\x5E\xEC\xAC\xBE\xA7\xE8\xA9\x7F\xA8\x61\x93\xC7\xAA\x0C\xAA\x83\xA8\xAA\xA8\x85\xA8\xAC\xA8\x87\xA8\xAE\xA8\x89\xA8\xB0\xA8\x8B\xA8\xB2\xA8\x8D\xA8\xD4\xAA\xFD\xAA\xF8\x39\x65\xA7\x20\x87\xFC\xAC\x3B\x0F\xFE\xAC\x79\x88\x4D\x83\x84\x96\x9E\x91\x05\x9C\x37\x8F\x03\x01\x11\xA1\xCA\xA9\x05\xAD\x85\x9B\xEA\xAC\x09\xAD\xE8\xAA\xB0\xA9\xEA\xAA\x30\x9F\xEF\x96\xB4\xA9\x02\x77\xEF\xAA\xE2\x81\x80\xA4\x71\x84\xF0\xA7\xBC\x9A\x8B\xA3\x67\x9C\x8D\xA3\xC1\x81\x85\xAA\x1D\x82\xAD\xAA\x62\xA7\x74\xA9\x8D\xA4\x8B\xAA\x27\xAD\xC4\x91\x28\x9C\xB1\xA7\x05\x76\xB3\xA7\x2D\x9C\x37\xA1\x2F\x9C\x04\xAD\x02\x01\x06\xAD\x6F\xA6\x2D\xAB\x27\xAB\xAA\x8A\xAD\xA9\x60\xAB\x59\xAA\x78\xA4\xE7\xA9\x7E\xA8\x45\xAA\xA4\xA3\x49\xA2\xB5\x89\xF1\xA9\x14\xAD\xF3\xA9\x16\xAD\xF5\xA9\x18\xAD\xF7\xA9\xD2\xAA\xFB\xAA\x1C\xAD\x19\xAA\xFE\xAA\xD7\xAA\xAA\x97\xD6\xA7\xEE\x91\xD8\xA7\xAA\x83\xDA\xA7\xEE\x6D\x5D\xA1\x0E\x93\x54\xAD\xD6\xA6\x56\xAD\xC6\x95\xF9\x8A\x59\xAD\x3E\xA9\xF4\xA8\x4F\xA8\x98\xA9\x0C\xAD\x5F\xAD\xCB\xA4\xA5\xA3\x62\xAD\x4B\xA2\x4A\xAA\xFE\xA8\x4C\xAA\x00\xA9\x50\xA2\x11\x90\xFD\xA7\x78\xAD\x2E\xAD\xFB\x8E\xF4\x8E\x22\x8B\x7E\xAD\x12\x99\x3F\xA9\xBD\xA2\x9E\xAA\xC5\xAA\xCE\xA8\x0F\xAD\x7C\xAA\xC9\xAA\xF2\xAA\xCB\xAA\xF4\xAA\x2E\xAA\xCE\xAA\x30\xAA\xD0\xAA\xF9\xAA\x6A\xAD\x17\xAA\xFC\xAA\x6D\xAD\xD6\xAA\xDF\xA8\x58\x8F\x92\x9C\x29\x90\x20\xAA\xFB\x69\x79\xAD\xEE\xA6\x08\xAD\xEE\x9F\x0A\xAD\x7D\xA8\x51\xA4\x33\xAD\x5D\xAA\xD2\xA9\x29\xAA\x60\xAA\x9F\x94\x4A\xA9\xF6\xAA\xA4\xAD\xF8\xAA\x32\xAA\xFA\xAA\xA8\xAD\x6C\xAD\x36\xAA\x2C\x7E\x1F\xAD\xAC\x83\x21\xAD\x3A\x0F\x64\x89\x65\x92\x66\x89\x07\x99\x48\xA8\xBC\xAA\x3E\x7D\xA9\x67\xB2\xAD\x1D\xA7\xE3\xA4\xB5\xAD\x31\xAD\xF5\xA8\x14\xAB\xC3\xAA\x0A\xA8\x9A\xAD\xA0\xAA\x9C\xAD\x57\xA8\x9E\xAD\x15\xA9\xF3\xAA\x17\xA9\xA7\xAA\x19\xA9\xA9\xAA\x84\xA7\xF6\xA7\x86\xA7\xF8\xA7\x2C\xA1\xFA\xA7\x2C\x7E\xB7\xA8\x21\x9D\xB6\x08\x7D\x8F\xBB\xA8\xA0\x8F\x37\xA2\xE8\xA8\x55\x9D\x59\xA2\x73\xA8\x66\x90\x0E\x81\x00\x00\xD5\xAD\x28\x96\x2F\xAD\xD8\xAD\x05\xA8\xDD\xA2\x50\xA7\xEE\xAC\xA3\xA3\x85\xAD\x61\xAD\x2E\x8B\x63\xAD\xBB\xA9\x15\xAD\xBD\xA9\x17\xAD\xBF\xA9\x19\xAD\xC1\xA9\x1B\xAD\x88\xAA\x52\xA9\x8A\xAA\x91\xA8\xA3\x73\x7E\xAC\x94\xA8\x1E\x19\x6D\xAA\x12\x9E\x8D\x63\x99\xA8\x26\x9F\x27\x01\xFE\xAD\x6A\xA4\xB4\xAD\x57\xAD\x7D\xAD\xE5\xA9\x9F\xA4\x98\xAD\x41\xA9\x9F\xAA\x2D\xA8\xED\xA9\x82\xA8\xC6\xA7\x84\xA8\x48\xA9\xF2\xA9\xBF\xAD\xA8\xAA\x6E\xA9\x5F\xA8\xD1\xAA\x4F\xA9\xD3\xAA\x13\xAE\xD5\xAA\x15\xAE\xFD\xA9\xA1\x6C\xE1\xA8\xD7\x97\x9D\x8F\xF3\x89\x35\xA2\xF5\xAD\xBD\xA8\xA2\x8F\x07\xAB\x52\xAA\xC1\xA8\xCC\xA1\x21\x95\xB1\xAD\x91\xAD\xDD\x8E\xEB\xAC\xD9\xAD\x81\xAD\xDB\xAD\x05\xAE\x52\xA7\x5E\xAA\xC0\xA3\xA3\xAA\x9F\xAD\x13\xAD\x0B\xAE\x65\xAD\x0D\xAE\x67\xAD\x0F\xAE\x69\xAD\x37\xAE\x6B\xAD\x39\xAE\x1D\xAD\x3B\xAE\xFF\xAA\x3D\xAE\x22\x8A\xE3\xA8\x06\x98\x56\x84\x75\xAD\x5D\x77\x60\x6D\x0D\x98\xDE\xA7\x4B\xAE\xB4", "\xA6\x93\xAD\x58\xAD\x26\xAE\xE5\xA7\x04\xAE\x61\xA9\xE9\xA9\xC4\xAA\x79\xAA\xAF\xA1\x66\xA9\xB1\xA1\x7D\xAA\xEF\xA7\x89\xA3\x0E\x9F\x3E\xAD\x6C\x9D\x40\xAD\xCF\x21\x8F\xA3\xC4\xAD\x34\xAA\xA9\xAD\xC7\xAD\x33\x7F\x8E\xA4\x76\xA2\xC3\x8F\x6E\xAE\xCC\x69\x21\xAE\xB5\xAA\x7B\xAD\x57\x84\xB6\xAD\x50\xA8\x99\xA9\x0D\xAD\x87\x98\x86\xAD\x09\xAE\x88\xAD\x54\x89\x5C\xAE\x31\xAA\x10\xAE\x33\xAA\x12\xAE\xAE\xAA\x46\xAD\x65\xA4\xA6\xA9\x24\xA9\xE3\x5E\x92\xA9\x90\xAE\x9E\x8E\xF4\x9F\xEA\x79\x95\xAD\xF3\xA8\xAF\xA9\xDA\xAD\xB9\xAD\x0E\xA9\xC1\x97\x36\xAD\x54\x76\x38\xAD\x64\x75\x7D\xA7\xF9\xA0\x7F\xA7\x6E\x01\x84\xA4\x33\xAE\xF7\xAA\x35\xAE\xA6\xAD\x5F\xAE\xC5\xAD\x61\xAE\xAA\xAD\x63\xAE\x6F\xAD\x30\xA3\x38\xA9\x0A\x99\xA9\xAE\xC1\x8E\xAB\xAE\xCB\x85\xAD\xAE\x9B\xAA\x97\xAD\xCB\xA8\x29\xAE\xDE\xAD\x2B\xAE\xA1\xAA\xEE\xA9\x56\xAE\xE3\xAD\xA0\xAD\xE5\xAD\xF5\xAA\xBD\xAE\xC1\xAD\xBF\xAE\xC3\xAD\xA7\xAD\x87\xAE\xC6\xAD\x1F\xAB\x28\x8C\xD1\xA3\x48\x9F\x58\xA9\x03\x01\x9F\x98\x9D\xA8\x5C\x0A\xCA\xAE\xEB\x8E\xCC\xAE\xDB\x83\xCE\xAE\xF9\xA6\xD0\xAE\x9D\xAA\xD2\xAE\x79\xAE\x62\xA3\x7B\xAE\x64\xA3\xEE\xA7\x66\xA3\x3C\xAD\x6E\x9B\xF2\xA7\x3D\x80\x83\xAA\x8E\xA3\x42\xAD\x29\x44\x1E\xA9\x03\x54\x20\xA9\x4E\x9B\x76\xA9\x3E\xAA\x8F\xAE\x4C\xAE\x05\x8F\x24\xAE\x94\xAE\x82\xAD\x5E\xAD\x16\xAB\x60\xAD\x68\xA2\x87\xAD\x6A\xA2\x9C\xAE\xA9\xA3\x6D\x88\xAB\xA3\x16\x87\x64\xAE\xD1\x9D\xE5\xAE\xC5\x9F\xA5\x6D\x10\xA3\x8E\xAE\xEB\xAE\x0A\xAF\x83\x8E\xD7\x75\xF0\xAE\xC9\xA8\xF2\xAE\x5D\xAD\xB8\xAD\x77\xAE\xDD\xAD\xF5\xAE\x11\xA9\x7B\xAA\xE1\xAD\x11\xAD\xB9\xA9\x58\xAE\x2D\xAA\x0C\xAE\x2F\xAA\x0E\xAE\x9E\xAE\x5E\xAE\xAC\xAA\x72\xA9\xA2\xAE\x89\xAA\x47\xAD\x16\xAE\x47\xA8\x31\x9E\x09\x99\x20\xAF\x20\xAE\x22\xAF\xFC\x8E\x7C\xAD\x0D\xAF\x51\xAE\x76\xAE\x97\xAE\x94\x9B\xE0\xAD\xB7\xA9\x30\xAF\x2B\xAA\x32\xAF\xCC\xAA\xA2\xAD\xC0\xAD\x36\xAF\xA5\xAD\xDF\xAE\xC1\xAE\xE1\xAE\xC3\xAE\x89\xAE\x90\x7F\xA6\xA9\x49\x9E\x23\x99\xC9\xAE\x44\xAF\x71\xAE\x25\xAE\x58\xAA\x17\xA3\x50\xAE\xB1\xAE\xB2\xA9\xB3\xAE\xED\xAA\xA3\xA2\xB6\xAE\x92\x87\xE2\xAD\x69\xA9\xE4\xAD\x6B\xA9\xDB\xAE\xE7\xAD\x34\xAE\xAA\xAA\x36\xAE\x39\xAF\x38\xAE\x3B\xAF\x14\xAE\x3D\xAF\x3C\xAE\x1B\xAF\x8D\xA9\x3C\x8D\x2F\x90\xDF\xA9\xCD\x6D\xA8\xAE\x60\xAF\x22\x30\x47\xAF\x66\xAF\x15\xAB\xD1\xA9\xF0\xAC\xE2\xA2\xD4\xA9\x82\xA9\x1B\xAB\xA1\xA9\xD8\xA9\xA3\xA9\xE3\xAE\x3C\x8B\x97\xA3\xD8\x6D\x90\xAD\x70\xAE\x84\xAF\x4F\xAE\x80\xA2\x48\xAF\x96\xAE\x84\xAD\x80\xA8\x99\xAE\x1A\x8C\x0A\xAE\x33\xAF\x5A\xAE\x35\xAF\x9D\xAE\x55\xAF\x9F\xAE\x86\xAE\xA1\xAE\x45\xAD\x3C\xAF\xA4\xAE\x48\xAD\x04\x9C\xAE\xA3\x7E\x81\x44\x8E\x5F\xAF\x96\xAF\x4E\xAE\x02\xAE\x3A\xA3\x28\xAF\x7A\xA4\xB1\xA9\x10\xA9\x7D\xA4\x40\xA3\x5D\x9F\x3A\xAD\x79\x77\x7F\xAE\xF1\xA7\x81\xAE\xA4\x9E\x83\xAE\x36\x78\x1C\xA9\x4A\x9B\x03\xAF\xF7\x23\x05\xAF\x6E\xAD\xAC\xAD\xBD\x85\x7D\xAF\x9C\xA7\xC9\x91\x3B\xAA\x03\x01\x3D\xAA\xB1\xA3\x6F\xAE\x41\xA6\x23\xAF\xAC\xAE\x73\xAE\x06\xA8\xB6\xAF\x08\xA8\x66\xAF\xB9\xAF\xEE\xAA\xBB\xAF\xF7\xA0\xB8\xAE\x6E\xA1\xBA\xAE\x3A\x80\xC1\xAF\x10\x9F\xC3\xAF\xA9\x48\x01\xAF\xCA\x87\xEC\xAD\x70\xA3\xEE\xAD\x8A\xAE\xAC\xAF\xF6\x9E\x1C\xAF\xB8\xA4\x28\x77\xF6\xA3\x00\x9B\x4A\xAE\x09\xAF\xB2\xAF\x30\xAD\xB4\xAF\x5A\xAA\xDA\xAF\x5C\xAA\xD8\xA1\x11\xAF\x47\xAA\x13\xAF\xA7\xA3\x15\xAF\x4B\xAA\x17\xAF\x4D\xAA\x19\xAF\xC6\xAE\xB6\xA4\x8D\xAA\x42\xAE\x3B\x0F\xF4\x94\x66\x6A\x6A\xAE\x5E\x82\x55\x8C\xD2\xAD\x29\xAB\xE7\xAC\x83\xAF\xB3\xAF\x4D\xA8\x39\x97\x99\xAF\x86\xAF\xDC\xAD\xBA\xAD\x89\xAF\xA4\xA7\x8B\xAF\x9F\xA9\x8D\xAF\x63\xAA\x8F\xAF\x65\xAA\x01\xA9\x6A\x90\x14\xA4\x6F\x9F\x47\x0F\x3F\xA4\x12\x04\x41\xA4\xF8\xAD\x43\xA4\x8D\x63\x45\xA4\x14\xA2\x43\xAF\xF8\xAF\x01\xAE\x17\xB0\xEF\x98\xB9\xA3\x29\xAF\x4A\xAF\xD5\x9F\x9E\xAF\x2A\x92\x9B\xAE\xB9\x89\xA4\xAF\xC2\xAD\xA6\xAF\xE0\xAE\xA8\xAF\xF9\xA7\xAF\xAA\xB6\xA8\xB1\xAA\x67\xA4\x71\xA8\x03\xAB\xAA\xAE\x6B\xA4\xB7\xAA\x0F\xB0\xFD\x9A\x70\xA4\x12\xB0\xF0\x9F\xF7\xAF\xD5\xAF\x45\xAF\x93\xAE\x98\xAF\x37\xB0\xB7\xAF\xDC\xAF\xB4\xAE\x1E\x86\xDF\xAF\x7F\xA4\xE1\xAF\xFD\xA2\xE3\xAF\x45\x77\xE5\xAF\xAB\xA2\xE7\xAF\x8E\x80\xC5\xAF\xF0\x9E\xC7\xAF\x0C\x78\x45\xB0\xA5\xA9\xEF\xAF\xB4\x82\x98\x9F\x28", "\xB0\xBC\xA8\xDD\xAA\x62\x90\x1B\xAE\xF9\x9E\x44\x0F\xE2\xAA\xF5\xAF\xF8\xA3\x3D\x75\x15\xB0\xF9\xAF\x35\xB0\x79\x9C\xFC\xAF\x99\xAD\x2C\xAF\xBA\xAF\x7B\xA7\xFB\xA2\x5F\xB0\x43\xA3\xFB\xAE\xA9\xA2\x63\xB0\x47\xA3\x65\xB0\x40\x80\x67\xB0\x3F\x9F\x69\xB0\xDE\x76\x6B\xB0\xC5\xA9\x47\xB0\x6F\xB0\xC1\x9F\xE4\xAA\xD0\x01\x06\xAB\x93\xAA\x08\xAB\x2D\x7B\xC0\xA4\x2E\x8C\xE6\x65\xEC\xAE\x44\x75\x23\xAE\x46\xAF\x57\xB0\x40\xA9\x43\xA1\x42\xA9\xD4\xAE\x4C\xAF\x67\xA9\x6D\xAF\x7E\xAA\x6F\xAF\x80\xAA\xE6\xAD\x82\xAA\x1A\xA9\xB8\x9F\x8D\xB0\xBA\x9F\x8F\xB0\x70\x43\xED\xAF\x5B\xAF\x6D\xB0\x45\x99\xDC\xA9\xF9\x8D\x48\xB0\xAC\x9B\xBA\xA4\xAE\x9B\xE6\xA4\xF3\x9F\x92\xAE\xF5\x9F\xF1\x87\xD7\xAC\x01\x01\x80\x48\x11\xAC\xEC\x87\x27\xB0\x41\x0D\xF9\x29\xDB\x37\xF1\x95\xC5\xB0\x00\x00\xBD\x00\xB8\xA0\xCA\xB0\x3D\xAB\xF3\x37\x30\x23\xCE\xB0\xA2\xA5\xBE\x00\xD2\xB0\x68\xAA\x19\x98\xA6\xA0\xD6\x95\xCF\xB0\xBF\x00\xDA\xB0\x54\xAC\xBB\xA0\x15\x42\x53\x0C\xE5\x95\x07\x97\x02\x01\xF2\x6E\x3B\xAC\x34\x86\x01\x0B\x9F\x9A\x2D\x74\xF9\xAC\x82\x07\x46\x2B\xFD\x0B\x7A\x2B\x05\xA6\x5E\x01\xEA\xB0\x9A\xA0\xB5\x9B\x94\x99\xF9\xA4\x86\x21\x35\x65\x5D\x61\x85\x07\xF6\xB0\xB2\x6F\xCF\xB0\xC1\x00\xE1\xB0\xDC\xAC\x5F\x7A\xBF\x97\x9E\x0B\xD7\xB0\x28\xAC\x01\x01\xC2\x00\x03\xB1\x70\xAC\x01\x75\x28\x95\x07\xB1\xE9\x95\xCF\xB0\xC3\x00\x0C\xB1\x96\xAC\xB7\x71\xFE\x6C\x80\x02\x08\xB1\xF4\xAF\xC4\x00\x14\xB1\x32\x72\x1D\x6E\xA6\x6C\x18\xB1\x11\xB1\xA2\xA5\xC5\x00\x1C\xB1\x4F\x72\xC6\x0D\x45\xA7\xCF\x41\xDA\x04\x19\xB1\xA8\xA0\x09\x01\xC6\x00\x24\xB1\x5F\x72\xDD\xAC\xCE\x1E\x29\x67\x16\xAC\x2A\xB1\x53\xAA\x09\x01\xC7\x00\x2E\xB1\x39\x5F\x79\x88\x83\x58\x17\x7D\xB4\x99\x7B\x4E\x27\x64\x59\x8E\x40\x10\xC8\x00\x18\x70\xCA\x6F\x70\x0F\xC9\x00\xBE\x70\xAB\x7C\xC1\x7D\x1C\xA7\x19\x65\xF7\xA6\x73\x66\x4B\x0D\xD3\x0E\xE1\x7C\x67\x7B\xF3\x8E\x9B\x3B\xAC\x66\x46\xB1\x1C\x75\x60\x00\x16\x73\x01\x01\x57\xB1\x21\x65\x4C\xB1\x40\xAB\x83\x0B\x4F\xB1\x3B\xA7\x86\x90\x92\xAD\xBF\xA5\xFF\xB0\xE6\x87\xCF\xB0\x33\x25\xC8\xB0\xAD\xA0\xB9\x64\x00\x06\x7E\x6C\xD1\xAC\x00\x00\xCB\x00\x70\x74\xBF\x9B\x20\x90\x99\xA7\x03\x01\x3C\xB1\x47\x99\xAA\x81\xD8\xAF\x03\xAE\xA0\xA7\x52\xAE\xA2\xA7\x1D\xB0\x9D\xA9\x1F\xB0\x61\xAA\x21\xB0\xF5\x93\x1D\xAB\x07\x8D\xA9\x9C\xE6\xAC\xC2\xA1\x8E\xA7\xD5\x97\x68\xA7\xE1\x9B\x6A\xA7\x56\x96\x61\x94\x9B\x10\x03\xAD\x08\xAF\x5C\x0A\x75\xB1\x11\x9E\xCC\x8A\x7D\xB0\x4F\xA4\x7F\xB0\xF4\xAE\x54\xAE\x2C\xA4\xEF\xA9\xCF\xA4\xA0\xAF\x51\xAF\x34\xAF\xA3\xAD\x54\xAF\x40\xB0\x38\xAF\xF7\xA7\x44\xAD\x44\xB0\xA3\xAE\x94\x9D\xC9\xAD\x4D\x9C\xCB\xAD\xEA\x66\x0A\xA1\x92\xA7\x0C\xA1\x14\x92\x28\xAD\x3D\xAC\x2A\xAD\x94\x92\x93\xB1\x0D\xA3\xA2\x89\x96\xB1\x9C\xAA\x98\xB1\xA5\xB0\x2A\xAE\x54\xA7\x2E\xA8\xC8\xAA\x4E\xAF\xCA\xAA\x50\xAF\xA1\xAD\xA0\xB1\x53\xAF\x3F\xB0\xDE\xAE\x41\xB0\x57\xAF\x43\xB0\xED\xAD\x91\xB0\x37\xAA\xB8\xB0\x6B\x6D\xAE\xA7\x37\x08\xB0\xA7\xB0\x96\x7B\x83\x70\xA8\xB3\x96\xFF\x87\x51\xAD\x91\xB1\x27\x01\xB6\xB1\xF4\xA3\x28\x87\x09\xA9\x5B\xA3\x5B\xAD\x75\xA7\x75\xAE\x9B\xAF\x10\xAF\x07\xAE\x12\xAF\x9A\xAE\x14\xAF\x3E\xB0\x16\xAF\xBD\x89\x18\xAF\xC1\x89\x22\xA9\x48\x9C\xD0\x96\x4A\x9C\xD2\x96\x4F\x8F\x99\xB0\xF2\x91\xDC\xA7\xEA\x8C\xED\xA8\x42\x6A\xDC\xB1\x22\xAB\xDE\xB1\x9A\xAA\xF1\xAE\x80\xAD\x19\xB0\x2A\xAF\x67\xA1\xEC\xAA\x79\xA7\x82\xB0\xF7\xAE\x7C\xA7\xF9\xAE\x7E\xA7\x87\xB0\x45\xA3\x89\xB0\x6A\xA3\xB0\xB0\x6C\xA3\xB2\xB0\x6E\xA3\xEB\xAF\x88\xA7\xB6\xB0\xF5\x7F\x8B\xAE\x8F\xAD\x92\xA9\xFB\xB1\x8E\xA9\xFD\xB1\x3D\xA9\x96\xAD\x00\xB2\x58\xB0\xDB\xAF\x02\xB2\xFE\xAF\xE6\xB1\x00\xB0\xE8\xB1\x02\xB0\xEA\xB1\x04\xB0\xEC\xB1\x06\xB0\xEE\xB1\x21\x99\xDC\x95\x49\xAE\xEB\x87\x34\xA0\xBA\x6A\x1D\x57\x46\xAE\x17\x95\xB2\xB1\xA1\xA1\xAF\xAD\x2C\xAD\x02\x01\x1A\xB2\x7E\xAF\xB8\xB1\xA0\xA8\xA7\x9F\x1F\xB2\xA4\xB0\x08\xAA\x2C\xA8\xBE\xB1\x2C\xAE\xC0\xB1\x2E\xAE\x12\xAD\x30\xAE\x64\xAD\x32\xAE\x72\xAF\xBE\xAE\x74\xAF\xC0\xAE\x76\xAF\x60\xAE\x78\xAF\x3A\xAE\x0E\x3A\xAA\xB1\x92\x90\x08\xA1\xED\xA4\xAF\x9C\x54\x97\xD0\xAD\x56\x97\x51\xB0\x47\xA4\x71\x6D\x3B\xB2\xCE\xAF\xB3\x87\xB9\xB1\x27\xAF\xE3\xB1\x83\xAD\xE5\xB1\x9D\xAF\x08\xAE\x9F\xAF\x3D\xB0\x92\x8A\xC7\xB1\x4E\xB2\x56\xAF\x50", "\xB2\xC2\xAE\x52\xB2\x62\xAE\x7A\xAF\x1A\xAF\x5B\x67\x3E\xAE\x55\xAC\xE3\x0B\x6B\xA8\x0B\xB0\xBF\x99\xDB\x97\x38\xA2\xD6\xB1\x29\x9D\xDE\x9C\xFB\xAD\xA9\x67\x60\xB2\xB9\xA7\x5F\x86\x63\xB2\x40\xB2\x28\xAE\xBC\xB1\xD3\xAE\x44\xB2\xD5\xAE\x2D\xAE\x9C\xB1\xC7\xA7\x9E\xB1\xC4\xB1\xA2\xAF\xA1\xB1\x6D\xB2\xE9\xAD\xAB\xAA\xA5\xB1\x3A\xAF\xA9\xAF\x79\xAF\xAB\xAF\x3E\xAF\x75\xA2\x93\xA8\x14\x05\x95\xA8\x2D\xB0\x97\xA8\xFF\x00\x1E\xAE\x71\xAA\x92\xB1\xB5\x88\x25\xAF\x0A\xA9\x12\xAB\x97\xA9\x9A\xAF\x66\xB2\x88\xAF\x17\xAB\xF1\xAC\x48\xAA\x1A\xAB\xF4\xAC\x33\xA9\xF6\xAC\x35\xA9\x25\xB0\x1F\x91\xB8\xA8\x33\xA2\x41\xAE\xF4\xAD\x94\xA4\xE9\xA1\x45\xAE\xF5\xB1\x1A\xA4\xDF\x97\x2F\xB2\xE4\xAA\xA7\xB2\xB9\x8C\xA3\xB0\x89\xB2\x42\xB2\xA6\xB0\x8C\xB2\xA8\xB0\x7C\xAE\xAA\xB0\x7E\xAE\x7F\xAA\x80\xAE\x81\xAA\x3F\xAD\xFF\xAE\x41\xAD\x11\xB2\x86\xAA\xB4\xB0\x8A\x77\xCD\xB1\xEF\xAD\x8E\xA4\x77\xB2\x53\xA2\x7B\xB2\x9B\x9F\xE5\x0A\x6F\xA8\x58\x9B\xDD\x9C\x71\x0F\xEC\xA8\x93\x79\xE6\x65\x84\xB2\x51\xAA\xDD\x8B\x3E\xB2\x7E\xA2\x88\xB2\xD1\xAE\x8A\xB2\x81\xB0\xDE\xAF\x83\xB0\x41\xA3\x85\xB0\x81\xA4\x0B\xB2\x68\xA3\x0D\xB2\x82\xA7\xE8\xAD\x1B\xA9\xEA\xAD\x1D\xA9\x13\xB2\x1F\xA9\x15\xB2\x23\x3A\xFC\xA7\x16\x65\x31\x98\x2F\x06\x0E\x93\xEA\xB2\x02\xA8\x35\x82\xC8\xB2\xF0\xB2\xCA\xB2\xBD\xB1\x0A\xAA\xBF\xB1\x10\xAD\x47\xB2\x31\xAF\x49\xB2\x59\xAE\x4B\xB2\xAF\xB0\xFC\xB2\xB1\xB0\xFE\xB2\xC6\xAF\x00\xB3\x04\xAF\x02\xB3\x37\x92\xCF\xB1\x82\x6D\xA6\xAE\x81\x67\x19\xB2\xA8\xB2\x78\xB1\xB5\xAF\x65\xB2\x0F\xAF\xAF\xB2\xFF\xAF\x18\xAB\xB2\xB2\xF3\xAC\x89\xAD\xF5\xAC\x8B\xAD\xF7\xAC\x8D\xAD\xC1\x7A\xB9\x9D\x78\x98\x3E\x88\xFB\x69\x09\xB3\x25\xA8\x55\x87\x0C\xB3\xF3\xAE\xF1\xB2\x9A\xB1\xC5\xA7\x8F\xB2\x2F\xAE\x91\xB2\xDA\xAE\x52\xAF\xDC\xAE\xA2\xB1\xC8\xB1\xA4\xB1\xEB\xAD\xA6\xB1\xCC\xB1\xA8\xB1\x46\xB0\x21\xB3\x39\xAA\x0E\x8E\xE7\xAE\x38\x91\x02\x8A\xC6\xB2\x76\xB1\xB4\x83\xA9\xB2\xE0\xB1\x64\xAF\x01\xB2\x58\x75\x7B\xB1\xA6\xA8\xBB\xAD\x5F\xAA\x7F\xB1\xBE\xAD\x62\xAA\x82\xB1\x23\xB0\x1E\xAB\x95\x80\x1A\xA6\xD5\x78\xB5\xB1\x26\xB3\x63\xAF\xA0\xA3\x7C\xA9\x5E\xB3\x9B\xA9\x7D\xB1\xD3\xA9\xF2\xAC\xD5\xA9\xB4\xB2\xD7\xA9\xB6\xB2\xD9\xA9\xB8\xB2\xDB\xA9\xFB\x6D\xDD\x93\x1E\xAF\x91\xA9\x42\xAF\x09\x01\x3A\xB3\x9D\xA8\x3C\xB3\xFA\xAF\x5C\xAD\x29\xB3\x38\xB0\x9C\xAF\x0E\xAD\x3B\xB0\x65\x93\x6B\xB2\x58\x8B\xEB\xB1\xE6\x8A\xED\xB1\x50\x8A\x08\xB0\x86\x94\xA7\xA9\x03\x01\x33\x9E\x65\x94\x56\xB3\x94\xB1\x68\x8B\xED\xB2\xB7\xA3\xEF\xB2\x3E\xB3\x0E\xB3\x8B\xB2\x10\xB3\x45\xB2\x12\xB3\x42\xB3\x48\xB2\x44\xB3\x70\xAF\x46\xB3\x4C\xB2\xDD\xAE\x6E\xB2\xC9\xB1\x70\xB2\x58\xAF\x72\xB2\xC4\xAE\x74\xB2\x93\xB3\x3E\x95\xC7\xA9\xBE\x6D\x6B\xB3\xC7\xB2\x85\xB3\xE2\xB1\x7A\xB1\x49\xAF\x89\xB3\x98\xAE\x69\xB2\x3C\xB0\xE9\xB1\x6C\xB2\x8F\xB3\x7F\x8B\x91\xB3\x83\x8B\x22\x90\xCD\xAF\x85\xB2\xDE\xA9\x16\x65\x8A\x8B\x80\xB3\x06\x01\x82\xB3\x99\x9F\x85\xAF\x22\xB2\x67\xAF\xE2\x9E\x09\xAA\x55\xA8\x2E\xAF\x4D\xAF\x13\xB3\x4F\xAF\x15\xB3\xA1\xAF\x17\xB3\xD4\xB2\x0F\xB2\xF5\xA7\x97\xB2\x4B\xB3\x99\xB2\xA7\xB1\xAA\xAF\xB0\xAA\x21\xB3\x59\x86\x94\xAF\x25\xB3\xB8\xB3\x87\xB2\xAF\xAE\x65\xAF\xD2\xB3\x87\xAF\x27\xAA\x60\xB3\x55\xAE\xBD\xAD\xD5\x98\x64\xB3\x7E\x94\x4A\xB3\xFF\xB2\x4C\xB3\xEC\xAF\xDB\xB2\xEE\xAF\x9D\xB2\x56\x77\xAE\xAF\x7F\x86\xB0\xAF\x73\xB1\x3A\xB2\x6C\xB3\x11\xAB\xE1\xB1\x7C\xA8\x95\xAE\xAE\xB2\xF1\xB3\x72\xB3\xBC\xAD\x62\xB3\xF5\xB3\x81\xB1\xF7\xB3\x83\xB1\x82\x94\x91\xAF\x76\x8F\xF1\xAF\x6E\xA4\xEE\x8D\xD0\xAF\x75\x03\xB7\xB3\x57\xB3\x38\x9E\xAA\x86\xED\xB3\x5C\xB3\xD9\x7A\xBC\xB3\x67\xB2\x8A\xB3\xBF\xB3\x8C\xB3\xC1\xB3\x8E\xB3\x29\xB2\x90\xB3\x2B\xB2\x92\xB3\xCB\xAF\xA6\x9B\x16\xB4\xB9\xAA\xF3\xAF\x2B\xB1\xC4\xB2\xFC\x9E\x81\xB3\x05\xB4\x39\x9E\xAB\xB2\x05\xAA\xEF\xB3\x1B\xB0\x23\xB2\x68\xB2\xE7\xB1\x6A\xB2\x27\xB4\x30\x8D\xC3\xB3\x22\x8C\xC5\xB3\x26\x8C\xEF\xB1\x86\x94\x69\xB1\x8E\xAA\x2A\x0A\x17\xA4\xCE\x9A\x74\xB0\x72\xA8\x8D\x63\x70\xAA\x77\x9F\xCC\x69\xCF\xB3\x7B\x85\xD1\xB3\x5D\xB3\x22\xB4\x2B\xB3\x24\xB2\x2D\xB3\x01\xB0\x49\xAA\x03\xB0\x8A\xAD\x05\xB0\x8C\xAD\x4E\xAA\x84\x82\xDB\xB0\x95\xB0\x49\x9F\x3F\x90\xFA\x9A\x4E\xB0\xC0\xAB\x30\xB0\x9A\xA8\x52\xB4\x36\xB4\x1E\xB4\x38\xB4\xE9", "\xAA\x3A\xB4\x70\xB3\x78\xAA\x40\xB3\xD0\xA8\xF4\xB3\xC4\xA3\xDD\xB3\x82\xAE\xD5\xB2\x84\xAE\xE9\xAF\x91\x80\x1D\xB3\xC8\xAF\x1F\xB3\x72\x93\x93\xB0\xD9\xAA\x69\xAA\x22\xAE\x4F\x90\x2A\x9B\x4E\xAD\x75\xB0\x50\xB0\x33\xB4\xBE\xB0\x99\xB3\xB7\xB1\x95\xB1\x9C\xB3\x29\xA8\xC9\xB2\x1C\xA1\xD5\xB3\x65\xA9\xD7\xB3\xA9\xB0\xC1\xB1\x57\xAE\xDB\xB3\x9F\xB1\x93\xB2\xC6\xB1\x42\xB4\xAD\x92\x44\xB4\xB1\x92\x46\xB4\x3E\x95\x24\xAB\x68\xAE\xF9\x7A\x9D\x9F\x68\xB4\xA0\x9F\x8B\xB4\x04\xAB\xFA\xB1\x6D\xB4\x0D\x8C\x1F\xB4\x20\xB2\xFD\xAF\x66\xA2\x2C\xB3\xB1\xB2\x5B\xB4\xB3\xB2\x30\xB3\xB5\xB2\x32\xB3\xB7\xB2\x34\xB3\x67\xAA\xC5\x7F\xDD\x8C\x06\x98\x16\x64\xBC\xA4\x34\xB2\x8F\xA9\x8D\x63\x9F\x95\x9D\xB0\xB9\x69\x53\xB4\xA8\x9B\x55\xB4\x21\xB4\xE4\xB1\x58\xB4\x3D\xB4\x25\xB2\x3F\xB4\x27\xB2\xC2\xB3\x29\xB4\xC4\xB3\x2B\xB4\xC6\xB3\x4F\xAA\xDD\xA9\xF3\x18\x24\xAB\xBD\xB0\xAB\xB4\x80\x53\xC0\xB0\x2C\xAB\xA1\xB0\xB3\x9B\x4B\x8E\xCF\xB0\x46\xA4\xB8\x9B\x1F\x8E\x1D\xB1\x21\x8E\x70\xB0\xE2\xB4\xA2\xA5\xE4\xB4\x2F\x68\xE5\xB4\x63\xB4\xF2\xAF\x3D\x90\xE3\xAC\x49\xA7\x39\xB2\x01\x01\x35\x7D\xEB\xB3\x90\xB4\x4E\xA8\x20\xB4\x0C\x7B\x72\xB4\x78\xAE\x74\xB4\xA2\xAA\x76\xB4\x30\xA4\x78\xB4\xC2\xAF\x7A\xB4\xC4\xAF\x1B\xB3\x68\xB0\x7E\xB4\x6A\xB0\x4E\xB3\xC8\x81\x55\xB2\x70\xA8\xAC\xB1\xD5\x65\xAE\xB1\x6F\x91\x6B\xA7\x01\xAD\x8D\x63\x90\xB1\xD3\xAF\xCC\x69\xF6\xB4\x1C\xB4\xCA\xB4\xFB\xB4\x57\xB4\x0B\xB4\xB0\xB2\x8A\xAF\x74\xB3\x8C\xAF\x76\xB3\x1C\xAB\x66\xB3\x84\xB1\xF8\xAC\x86\xB1\x3F\x88\xFB\xAC\x57\xB2\x90\xA7\x54\x96\xAF\xB1\xE3\x9B\x49\xAD\x10\x8E\xB3\xB1\x52\x83\x03\xB4\xF5\xB4\xAD\xB4\x24\x94\xAF\xB4\x41\xB2\x93\xB4\x43\xB2\xA2\xB3\x8D\xB2\x46\xB2\xA5\xB3\x14\xB3\xA7\xB3\xAD\xB0\x71\xAF\x18\xB3\x73\xAF\x96\xB2\x75\xAF\x98\xB2\x77\xAF\x9A\xB2\x53\xB2\x9C\xB2\x7B\xAF\x17\xAE\x47\x0F\xAF\x96\xE5\x31\x68\xB4\x7F\x83\x45\x8F\xDA\xB1\x09\x01\x18\xB5\x9A\xB3\xEC\x8C\xDF\xB1\x7A\xA8\x07\xB4\x13\xAB\x1A\xB0\xFC\xB4\x2B\xAF\xFE\xB4\xD6\xAE\x00\xB5\xD1\xA4\x02\xB5\xE6\xAF\x04\xB5\xE8\xAF\xD7\xB2\x43\xAD\xE3\xB3\x4D\xB3\xE5\xB3\x4F\xB3\xFE\xB3\x2B\x97\x47\x0F\x90\x7E\x73\xAD\xF0\x91\x88\xB4\xCB\x9A\x77\xAD\x92\xA9\x56\xB5\x8E\xB4\x9B\xB3\x59\xB5\xA1\xA8\x37\xB5\x92\xB4\xB3\xA9\x69\xAF\x84\xA3\x6B\xAF\x2B\x51\xBD\xAF\x42\x77\xF8\xB2\x83\xA4\xFD\xAE\x3C\x83\x44\xB5\xFD\xB2\xE1\xB3\xF9\xB3\x6A\xB5\xFB\xB3\x0A\xB5\x92\xB0\x21\xB3\x7C\xA1\x93\x82\x0E\x93\x78\xB5\xDD\xB1\x62\xB2\xF8\xB4\x18\xB0\xB0\xB4\x80\xB0\x60\xB5\x8E\xB2\xD7\xAE\x6E\xAF\xD9\xAE\xA8\xB3\xC5\xB1\x47\xB3\x95\xB2\x8B\xB5\x46\xB5\xE2\xB3\x48\xB5\xE4\xB3\x9B\xB2\xE6\xB3\x6E\xB5\x26\x9C\x9F\x91\x37\xB2\x59\x96\xB0\xAD\x17\xB5\x35\xB5\xBB\x9B\x5B\xB3\x9B\xB5\x99\xB1\xF2\xB3\x9B\xB1\x9F\xB5\xAB\xB0\xA1\xB5\x41\xB5\xA9\xB3\x43\xB5\x4D\xB2\x45\xB5\x4F\xB2\x47\xB5\x51\xB2\x49\xB5\x73\xB2\x64\xA7\xEF\xB0\x69\x91\xC3\xA1\xAD\x9C\xC5\xA1\x43\xA8\x5A\xB2\xB3\x9C\x68\x89\x5D\xB2\x52\x09\x42\x6A\x96\xB5\xFC\xB1\x98\xB5\x7B\xB5\x3F\xB2\x7D\xB5\x0D\xB3\x39\xB5\xCB\xB2\x3B\xB5\xCD\xB2\xF8\xAE\x7D\xAE\xFA\xAE\xBF\xAF\x3D\xAD\xD3\xB2\x79\xB4\xDF\xB3\x84\xAA\x68\xB5\x02\xAF\x08\xB5\x90\xB0\x90\xB5\xCE\xB1\xAD\xB5\x4B\x9D\xBA\xB2\xB8\x0E\xF3\xAD\xE5\xA8\x71\xB0\xE7\xA8\xC0\xB2\xA2\xB2\xEA\xA8\x71\x0F\x74\xA8\x54\xB5\x06\x01\xD5\xB5\x1B\xB2\xD7\xB5\xFE\xB1\x26\xAF\x9E\xB3\xBB\xB1\xA0\xB3\xF2\xB2\x6A\xAF\x5D\xB0\xF0\xAA\x84\xB5\x97\x83\x86\xB5\x80\xA7\xFA\xB2\xF3\xA7\xE7\xB5\x00\xAF\xE9\xB5\xEA\xAF\xFA\xB3\x14\xB2\xFC\xB3\xB7\xB0\xEF\xB5\xAD\xAF\x18\xAE\xA0\xB2\x1A\xAE\x74\xB5\xBE\x82\xB9\x92\xD2\xB5\xCC\x09\xD4\xB5\xB4\xB5\x5D\xB1\xB6\xB5\x38\xB5\x7F\xB5\x05\xB2\xF3\xB2\x07\xB2\x84\xB0\x09\xB2\xB9\xAE\x0C\xB6\xBB\xAE\x88\xB5\xC1\x77\x10\xB6\xD6\xB2\x06\xB5\x8E\xB0\xEB\xB5\xB5\xB0\x16\xB6\x16\xB2\x21\xB3\x77\xB2\x22\x9D\xE4\xA8\x1C\x90\xDC\xAA\xF6\xB5\x7C\xAD\x9F\x9F\x4A\x6D\x96\xAA\x03\x01\xFE\xB5\x3C\xB2\x8F\xB4\xD8\xB5\xEE\xB2\xDA\xB5\x9F\xB3\xDC\xB5\x0F\xB3\xD6\xB3\x11\xB3\x9D\xAD\x98\xB4\xD8\xAE\xC3\xB1\x45\xB3\xA3\xB5\xAA\xB3\x48\xB3\xAC\xB3\xF8\xB3\x1C\xB3\x14\xB6\x01\xB3\x38\xB6\x03\xB3\xDD\xB2\x66\xAE\xB1\x8F\xC9\x7F\xE0\xB2\x25\x9D\x7D\xB2\xF7\xAD\x58\xA2\x2E\xB0\xEB\xA8\x6D\xAE\xF9\xB1\x71\x6D\x46\xB6\x61\xB2\x3D", "\xB2\x49\xB6\x9D\xB3\x4B\xB6\x04\xB6\x4D\xB6\xA1\xB3\x4F\xB6\xA3\xB3\x51\xB6\xD9\xB3\xC2\xB1\x9A\xB4\x92\xB2\x64\xB5\x64\xB0\x66\xB5\x66\xB0\x34\xB6\xB3\xB0\x36\xB6\xDA\xB2\xED\xB5\xDC\xB2\x92\xB5\x03\xA9\x32\x98\x77\xB5\x23\xB6\x5A\xAD\x25\xB6\x7E\xB5\x68\xAF\x28\xB6\x07\xB6\xF4\xB2\xBC\xAF\xF6\xB2\x3B\xAD\xE3\xB5\xFC\xAE\x0E\xB6\xFE\xAE\x32\xB6\x7B\xB4\x12\xB6\x7D\xB4\x5C\xB6\x1E\xB3\x5E\xB6\x20\xB3\x18\xB6\xC7\x1C\x97\xA2\x25\xA9\xCD\xB3\x45\xB6\x8C\xB6\x7F\xAD\x73\xB6\x87\xB3\x59\xB0\xD2\xB3\xDD\xAF\x92\xB6\x2A\xB6\xF5\xB2\x2C\xB6\xE2\xAF\x2E\xB6\xE4\xAF\xE5\xB5\x03\xB5\x9B\xB6\x05\xB5\x8C\xB5\x5B\xB6\x8E\xB5\x15\xB6\x86\xB6\xFD\xB3\x4C\xB5\xD5\x6D\xC8\xAE\x33\xB5\x00\x00\x6E\xB6\xC9\xB3\x00\xB6\x1D\xB2\xAE\xAE\x6F\xB4\x32\xAD\x71\xB4\x1C\xB5\xEF\xAC\x1E\xB5\x1E\xB0\x20\xB5\x20\xB0\x22\xB5\x8E\xAF\x78\xB3\x90\xAF\x7A\xB3\xF0\x8F\x21\xAB\xFF\xB5\x2D\x9C\x53\xB3\xBB\x90\x78\x85\x34\x7D\xA9\xB6\x1E\xB2\xAB\xB6\xBB\xB3\xCC\xB4\x1D\xB5\xB3\xB4\x1F\xB5\x2E\xB3\x75\xB3\xB7\xB4\x77\xB3\xB9\xB4\x79\xB3\xE0\x76\x07\xAF\x16\xB5\x5C\x0A\xC6\xB6\xEB\xB2\x86\xB2\x99\xB5\x36\xB0\x26\xB6\x90\xB6\x94\xB4\x7A\xAA\x50\xB6\x2F\xAF\x7A\xB6\x99\xB4\x40\xB5\xD2\xB2\xAE\xB0\xDE\xB3\x19\xB3\x10\xB2\x82\xB6\x12\xB2\x9F\xB6\x7F\xB4\xA1\xB6\x81\xB4\x50\xB3\x2F\xB4\x02\xAB\x6F\xA4\x90\xA9\xDF\x93\x8B\xB6\xF7\xB4\x71\xB6\x91\xB4\xDB\xB5\x27\xB6\xFA\xB6\x7A\xAE\x96\xB4\xCE\xB2\x52\xB6\xA0\xB5\x54\xB6\xA2\xB5\x9C\xB4\xA4\xB5\x9E\xB4\x80\x94\xCB\xB1\x8F\xB5\x6C\xB5\x6C\xB0\xA3\xB6\x6D\xA7\x44\x0F\x32\x9E\x95\xB5\xE1\xB6\xCA\xB6\x5B\xB5\xAC\xB2\x5D\xB5\xCE\xB6\x06\xAE\xCE\xB4\x5A\xB4\x26\xB2\x5C\xB4\x28\xB2\x5E\xB4\x2A\xB2\x60\xB4\x07\xB0\x2D\xB4\x92\x7F\xB5\xB3\x02\x01\xC9\xA9\x22\xA8\xF2\xB6\x2D\xB7\xCF\xAE\x03\xB6\xAC\xB6\x21\xB2\x39\xB0\x1F\xA2\x8B\xB3\x6C\x97\x8D\xB3\x41\xB4\xD3\xB4\x43\xB4\xD5\xB4\x45\xB4\xC7\xB3\xDA\xB6\x47\xB6\x27\x9B\x80\xAF\x4B\x99\x31\xB2\x43\xB7\x13\xB7\x01\xB6\xAA\xB2\x2F\xB7\x39\xB4\x56\xB4\xE5\xB6\xCF\xB6\xE7\xB6\xD1\xB6\xE9\xB6\x21\xB5\xEB\xB6\x23\xB5\xD6\xB6\x24\xB0\xBB\xB4\x0B\x86\x0C\x90\x98\xA3\xA7\xB6\x02\x01\xF3\xB6\x0A\xB3\xEC\xB2\x14\xB7\xF9\xB4\xB7\xB5\x3F\xB3\xB9\xB5\x41\xB3\xBB\xB5\xD0\xB2\xAC\xB0\x01\xB7\x42\xB5\x03\xB7\x8A\xB5\x1A\xB3\xBB\xB6\x07\xB5\x08\xB7\x09\xB5\x26\xB7\x91\xB5\x28\xB7\x95\xA7\x51\xAB\xD8\x8B\x02\xB4\x52\xAD\x34\xB5\x5B\xB7\xC9\xB6\x45\xB7\xE3\xB6\x2B\xA9\x32\xB7\x53\xAE\x78\xB7\x75\xB4\x0E\xB4\x77\xB4\xF6\xB3\x61\x95\x5A\xB6\x83\xB7\xBD\xB6\x5D\xB6\xBF\xB6\x17\xB6\xC1\xB6\x81\x6D\x51\xB3\x49\x87\x19\xB4\x51\x03\x94\x92\x71\xB7\x3B\xB3\x0B\xB3\xB9\xB3\x08\xB4\x0E\xAF\x88\xB3\x23\xB4\xBE\xB3\x3E\xB4\xC0\xB3\xD1\xB4\x28\xB4\x39\xB7\x2A\xB4\x3B\xB7\x2C\xB2\xD7\xB4\x7D\xB3\x09\xB1\x78\xB0\xC5\xB2\xE0\xB6\x8F\xB7\x59\xB3\x5A\xB5\x8E\xB6\x16\xB7\xF9\xB6\x3A\xB5\x77\xB6\x3C\xB5\xA4\xB3\x7A\xB7\xE2\xB5\xD1\xB2\xC0\xAF\xB7\xB6\x65\xB5\xB9\xB6\x67\xB5\x06\xB7\xD8\xB2\x84\xB6\x9D\x76\xA0\xB7\x39\xB6\x88\xB7\xC8\x9A\x0A\xB0\xBD\xB2\x3A\x0F\x0D\xB0\xFB\x81\x1D\xB6\x0F\xB7\x4F\xB4\x44\xB6\x70\xB7\x44\xB7\xFF\xB1\x92\xB7\x6F\xB3\x94\xB7\x7C\xB1\xD0\xB6\x7E\xB1\xD2\xB6\x80\xB1\xD4\xB6\x22\xB0\x69\xB7\x67\xB3\x6B\xB7\xAA\x8C\xEF\xB4\x17\xB4\x23\x8E\x3F\x0F\x2A\xB0\x82\x30\x1B\x95\xC2\xB4\xBE\xA4\x2F\xB0\xE2\xB7\x8E\xB7\x19\xB5\x3D\xB3\x74\xB6\x17\xB7\xC6\xB7\x95\xB4\xFC\xB6\xD8\xB3\x3E\xB5\xDA\xB3\x00\xB7\xCD\xB7\x02\xB7\xE6\xB5\x04\xB7\xE0\xB3\xA7\xB5\x8D\xB5\xA9\xB5\x6B\xB5\xAB\xB5\x6D\xB5\xA2\xB7\x69\x95\x48\xB0\x06\x98\xB0\x8C\x4D\xB0\x4D\xB4\x1E\xB6\x8A\xB4\xFB\x9E\x8C\xB4\xBF\xB7\x00\xB8\xAC\xB7\x5C\xB5\xCD\xB6\x61\xB7\x33\xB7\x24\xB4\xB2\xB7\x26\xB4\xB4\xB7\x4E\xB7\xB6\xB7\xD4\xB4\xB8\xB7\x2C\xB4\xA2\xB4\x54\x59\xA4\xB4\x49\xB4\xC0\x99\x72\xB0\xA7\xB4\x1C\xB8\xE0\xB7\x8E\x10\x77\xB0\xEC\xB4\x80\x53\x22\xB6\xC0\xB7\x27\xB3\xFB\xAF\x47\xB7\xB1\xB4\xAF\xB6\x81\xB5\x08\xB6\x39\xAD\x95\xB6\xBE\xAF\xCC\xB7\xE4\xB5\x0C\xB8\xB8\xB6\x0E\xB8\xE8\xB5\xD2\xB7\x69\xB5\x12\xB8\x25\xB7\x14\xB8\x27\xB7\x16\xB8\xC5\x6D\x33\xB8\x64\xB6\xD3\xB5\x6F\x90\x80\x9B\xDF\xB7\xBA\xAA\x9B\xB0\x0A\xAB\x30\x7B\xA9\x67\xA9\xB7\x83\xB3\xAB\xB7\xEC\xB3\xCB\xB6\xB0\xAE\x25\xB8\x0A\xB4\x62\xB7\x59\xB4\xB4\xB4\x36\xB7\xB6\xB4\x5D", "\xB4\x31\xB3\x5F\xB4\x33\xB3\x61\xB4\x7B\xB3\x1C\x6C\xBB\xB0\x94\xB0\xD8\x87\xD7\xAD\x24\xAE\xE5\xA4\xF2\x9F\xDF\xB4\x26\xAB\x41\xB6\x7F\x83\xF3\xB4\x42\xB7\x27\x01\x4D\x7D\x3F\xB8\x6D\xB3\xE6\xA9\x42\xB8\x9C\xB5\x96\xB7\xFF\xB4\x98\xB7\x01\xB5\x9A\xB7\x04\xA2\x9C\xB7\x35\xB6\x84\xB7\xEC\xB5\x86\xB7\x1E\x80\x0C\xB5\x58\x9B\x0E\xB5\xED\x71\x10\xB5\xFF\xAC\xE4\xA0\x26\xAD\xE6\xA0\x6E\xA7\x38\xB2\x83\xB8\x09\x01\x85\xB8\x22\xB8\x66\xB8\x5E\xB7\x70\xB4\x60\xB7\x6A\xB8\x27\xB8\xB1\xB7\xCF\xB4\xB3\xB7\x37\xB7\xD2\xB4\x2D\xB8\x50\xB7\x2F\xB8\x32\x79\x97\xB8\x2E\x8F\x2A\xB5\x8A\xB1\x00\x9C\x35\x7E\x02\x9C\xCA\x75\x30\xB5\xFC\x9F\x10\xA1\x94\x92\xA4\xB8\x57\xB5\x1A\x8D\xF6\xB6\x7E\xB0\x89\xB8\xB8\xB5\x0C\xB4\x61\xB3\xEC\xB7\x63\xB3\x10\xB4\x9B\xB7\x12\xB4\x65\x95\x14\xB4\x36\x89\xD1\xB1\x65\x08\xD3\xB1\x50\xB5\x38\xB8\xB9\xA4\xB5\xA7\xC4\x85\xC0\xB8\xE4\xB7\x02\xB6\xE6\xB7\xCF\xA9\xE8\xB7\x5F\xB3\xC8\xB8\xF3\xB3\x8D\xB8\x63\xB5\x8F\xB8\x29\xA2\x91\xB8\x83\xB6\x93\xB8\x37\xB6\xD6\xB7\x5F\xB6\x92\xB5\xF1\xB1\x59\xA1\xF3\xB1\x4C\x9C\x68\xB6\x88\x8B\x76\xB5\x6F\xB7\x01\x01\xC1\xB8\x79\xB5\x58\xB5\x5C\xB7\x5A\xB3\x6E\xB3\xDE\xB8\x26\xB8\x95\xB7\xE1\xB8\xBA\xB5\x62\xB5\xC9\xA7\xE5\xB8\x8E\xA2\xE7\xB8\x07\xB7\x9E\xB7\xA0\xB6\xEB\xB8\xA2\xB6\x56\xB8\x35\x76\x18\xB2\xF5\xB8\x00\x00\xF7\xB8\x97\xB5\x70\xB6\xFA\xB8\xC2\xB7\xFC\xB8\x25\xAA\xDF\xB8\x71\xB3\xEA\xB7\x73\xB3\x65\xB7\xD3\xB6\x67\xB7\xD5\xB6\xED\xB6\xD7\xB6\xF2\xB7\x3D\x8F\xF7\xB0\x52\xAB\xE5\xAC\x60\xA6\x42\x6A\x11\xB9\xD6\xB5\x13\xB9\x90\xB7\xE5\xB7\x67\xB8\xEE\xB3\xA9\xB8\x2A\xB3\xE6\xB6\x6C\xB8\xE8\xB6\xB5\xB4\x2F\xB3\x70\xB8\xB8\xB4\x72\xB8\xBA\xB4\x17\x77\xB5\xB8\x98\x91\x2B\xB5\x53\x97\x65\x89\x8A\xAC\x9F\xB8\xD1\xAD\xAA\xB4\xC3\xA8\xB9\x69\x29\xB9\xDB\xB6\x48\xB6\x14\xB9\x7C\xB5\x2E\xB9\xFA\xB4\xAA\x7A\x5E\xB5\x1C\xB0\x1A\xB9\x0D\xB4\xCA\xB8\x0F\xB4\xEE\xB7\x65\xB3\xF0\xB7\x25\xB5\x22\xB9\xD4\x90\xD9\xAA\x8B\x92\x34\xB8\x69\xAE\xD6\xB8\x31\xB4\xFA\xAD\x20\xB6\x04\x7F\x28\xB9\xDB\xB8\x5D\xB7\xC3\xB7\x4C\xB6\x03\xB8\xDD\xB5\xC7\xB7\xDF\xB5\x08\xB2\xE1\xB5\x0A\xB2\x97\xB6\x88\xB0\xCE\xB7\x7F\xB6\xD0\xB7\x81\xB6\x82\xB7\x92\xB8\x08\xB9\x09\xB7\x0A\xB9\x0B\xB7\xD8\xB7\xD5\x7D\x21\x0F\xFF\x9C\xF2\xB8\xF9\xB5\xA4\xB2\xFE\xB7\x10\xB9\x65\xB9\xFB\xB8\x88\xB8\xE4\xB6\xAA\xB8\xFF\xB8\x51\xB9\xC9\xB8\x1C\xB9\xED\xB7\x1E\xB9\xEF\xB7\x20\xB9\x6A\xB7\x74\xB8\xEF\x89\xF1\xB5\x97\x68\xBA\xA8\xF4\xB5\x43\xAE\xBF\xB2\x80\xB8\x1D\xAF\xC3\xB2\x1F\xB8\xDC\xB4\xFB\x69\x47\xB9\x55\xB7\xF9\xB8\x2C\xB9\xDC\xB8\x4C\xB9\x76\xB7\x05\xB6\x9D\xB5\x3D\xB5\xCA\xB7\x6F\xB9\x4A\xB8\x98\xB6\x72\xB9\x8A\xB0\x80\xB6\x8C\xB0\x50\xB8\xEA\xB5\xE9\xB8\x85\xB6\x95\xB8\x87\xB6\x7C\xB9\xDE\xB2\x67\xAE\x5D\xB9\x07\x93\xE1\xB4\x9C\xB9\x0C\x98\x2C\x8A\x0E\x93\xA1\xB9\x6F\xB6\x49\xB9\xA4\xB9\x66\xB9\x16\xB9\x43\xAA\x3B\xB4\xB2\xB4\x33\xB9\x64\xB7\x35\xB9\xEA\xB6\x37\xB9\xEC\xB6\x39\xB9\xEE\xB6\x93\xB9\x7C\x81\x89\xB6\x07\xB3\x92\xA9\xC3\xB9\xC7\xB6\x2B\xB9\xC1\xB7\x4B\xB9\xA7\xB8\xCC\xB6\x30\xB9\xAF\xB7\xCD\xB4\x28\xB8\xAD\xB8\x2A\xB8\xAF\xB8\xB5\xB7\x71\xB8\x3A\xB7\x73\xB8\x3C\xB7\x31\xB8\x8E\x75\x23\xB3\x99\x9D\x5F\xA1\x84\xB8\x85\xB9\x15\xB9\x87\xB9\x93\xB7\xFE\xB8\xE9\xB7\x63\xB7\xEB\xB7\x8D\xB9\xCB\xB8\x55\xB9\x11\xB4\x24\xB5\x13\xB4\xD8\xB6\x0B\x86\xC3\xB6\x8D\xB7\x84\xB9\x86\xB8\x06\xB4\x67\xB9\x02\xB8\xC5\xB7\x6A\xB9\x05\xB8\x78\xB6\xFD\xB6\x08\xB8\x7B\xB6\x0A\xB8\x4B\xB8\x7E\xB7\x0D\xB8\x80\xB7\x05\xB7\x76\xB9\xE8\xB8\x78\xB9\x85\xB7\x54\xB8\x87\xB7\x0C\xB9\xCD\x94\xC8\xB3\xF4\xB6\xCF\xAF\x16\x65\xD7\xA2\xD2\x81\x5C\x0A\xD9\xB9\x1F\xBA\xC8\xB6\xDC\xB9\xD9\xB5\xA6\xB9\xF8\xB6\xD4\xB3\x04\xB8\xFB\xB6\x0C\xBA\x07\xB8\xAB\xB9\x2D\xB6\x70\xB9\x0C\xB2\xAF\xB9\x0E\xB2\x4E\xB8\x11\xB6\xB3\xB9\x13\xB6\x18\xBA\x94\xB8\x1A\xBA\x1E\x80\xF0\xB6\xB2\xB5\x24\xBA\xF2\xB9\xDD\xB9\x07\xBA\xC6\xB8\x77\xB7\x00\xB9\x79\xB7\x02\xB9\x12\xA8\x04\xB9\x5F\xA4\xCE\xB8\x53\xA1\xD0\xB8\x97\x8F\x1E\xBA\x72\xB7\xC3\xB4\x8E\x10\xE6\x98\x0F\xB9\x25\xBA\x52\xBA\x1C\xB2\x28\xBA\x4A\xB6\x2A\xBA\x8F\xB6\x2C\xBA\x0A\xBA\x2E\xBA\xC8\xB7\x79\xB6\x0E\xBA\xFF\xB6\x4D\xB7\xA9\x92\xA5\xB5\x81\xB7\x10\xB8\xBC\xB6\x52\xB8\xBE\xB6\xB7\xB9\xC0\xB6\x75\xB2\x3F", "\xAF\x48\x0F\x2B\xB7\xD8\xB9\x42\xBA\x29\xBA\xDE\xB9\x68\xB8\xE0\xB9\xAD\xB6\x49\xB7\xBE\xA3\x6C\xB9\x2B\xB6\x6E\xB9\x32\xBA\xAD\xB9\x71\xB9\x4C\xB8\xCF\xB7\x37\xBA\x33\xB6\x16\xBA\x07\xB9\x6B\xBA\x9F\xB7\x6D\xBA\xA1\xB7\x6F\xBA\x8E\xB1\x52\xA3\x4A\x9E\xFC\xB5\x03\x01\x57\xBA\xAA\xB7\x73\xB7\x4A\xB9\x75\xBA\x44\xBA\x88\xB9\x31\xB9\x6B\xB8\x34\xB7\x6D\xB8\xD0\xB4\xE6\xB9\x2C\xB8\xE8\xB9\xB7\xB7\xEA\xB9\xB9\xB7\x77\x90\x51\xBA\x93\xBA\xF7\x7A\x57\xB7\xC2\xB9\x74\xBA\x5B\xBA\x76\xBA\x2F\xB9\xCB\xB4\x89\xB9\xF7\xB9\xCC\xB9\xF9\xB9\xCE\xB9\x66\xB7\xD0\xB9\x68\xB7\x91\xB9\xF1\xB7\xD4\xB9\x51\x85\x6D\xB7\xE9\xB3\x56\xBA\xAA\xBA\x72\xB6\x5C\xBA\xC4\xB7\x5E\xBA\x4E\xB6\x0B\xBA\x61\xBA\x0D\xBA\x31\xBA\xB4\xB6\x33\xBA\xF9\xB2\x35\xBA\xFB\xB2\x14\xBA\x0F\xB8\xC3\xB5\xA8\xB5\xC5\xB5\xAA\xB5\x4A\xB5\xAC\xB5\x1C\xBA\x19\xB6\xE1\x95\x8B\xB7\x8A\x94\x0A\x99\x92\xBA\x64\xB8\x94\xBA\xC6\xB9\x86\xB9\x27\xAE\xC1\xBA\x68\xA1\x18\xB7\xF6\xAE\x1A\xB7\xE0\xB5\xCF\xB2\xCB\xB7\x7C\xB7\x0B\xB8\x12\xBA\x4D\xB8\xCD\xBA\x4F\xB8\x86\xBA\xD3\xB7\xB5\xB9\xD5\xB7\x8A\xBA\xD7\xB7\xD5\xBA\xF0\xAF\xA5\xBA\xDC\xBA\xA3\x86\xA6\xB7\x58\x03\xDA\xB8\x05\xBA\x37\xB4\xAC\xBA\x4D\xB9\xCB\x82\xF6\xB9\xE0\xB8\x8B\xB9\xE2\xB8\x53\xB9\x99\xB7\xCC\xB8\x90\xB8\x4D\xBA\x98\xA1\x4F\xBA\xAB\x8F\xF7\xBA\x42\xB6\xBC\xB7\x3C\xB8\xB8\x54\x64\xB9\xFD\xBA\x6E\xB4\xFF\xBA\xA7\xB9\x75\xB6\x06\xB6\x45\xB8\x93\xB6\xE0\xAF\xB3\xB6\x60\xB0\xB5\xB6\x62\xB0\xCB\xBA\x0F\xB6\x84\xBA\x9C\xB6\x39\xBA\x9E\xB6\x3B\xBA\xEA\xB8\xF3\xBA\xEC\xB8\x7C\xB9\x48\xB4\x59\xB8\x51\x0C\x51\x0C\x18\xA4\xFB\xB7\x6E\xAA\x71\x0F\x50\xB4\xCD\xA1\xA0\xB9\xBE\xBA\x15\xB7\x68\xB9\x09\xBA\xC3\xBA\x60\xBA\x7C\xBA\xB2\xB6\x7E\xBA\xC8\xBA\x80\xBA\x34\xBA\x82\xBA\x73\xB9\x23\xBB\xBA\xB6\x69\xBA\x9D\xB7\x88\xBA\x09\xB9\x29\xBB\x0B\xB9\x8C\xBA\x17\xB8\xD3\xB0\xF5\xB7\xF1\xB4\x43\x0F\xF8\xB7\x7F\x8C\x21\x9F\x50\xBB\x10\xB0\xFE\x9A\x83\xB9\xDB\xBA\xD0\xB3\x01\xB8\x45\xBA\xA8\xB9\x8B\xB8\x61\xB5\xE3\xB8\x03\xB9\x08\xBB\xE6\xB8\x0A\xBB\x08\xA2\x0C\xBB\x13\xA4\x83\xB4\xE9\xB4\xED\xAE\x4C\xB0\x53\x7D\xBF\xB9\x1E\xB8\xD2\x94\xBE\xB7\xA3\xB8\x37\xBB\x75\xB7\x2B\xBA\xE2\xBA\x2D\xBA\x19\xB7\x06\xB8\x97\xB4\xFE\xB6\x53\xB6\x7C\xB6\x55\xB6\x20\xB7\x57\xB6\x67\xBA\x15\xBA\x47\xBB\x77\xB9\x49\xBB\x79\xB9\x4B\xBB\x7B\xB9\xF5\xBA\x6E\xB0\x69\xBB\x64\xB4\x3F\xB6\x60\x90\xDE\xAA\xC1\xB2\x53\xBA\x71\x0F\x3B\xB8\x31\xB0\x72\xBB\x14\xBB\xAE\xB4\xC0\xBA\x39\xBB\xC2\xBA\x76\xB6\xC4\xBA\x3D\xBB\x94\xB6\x1D\xBB\x86\xB0\xC9\xBA\x87\xB5\x99\xB6\x89\xB5\xC1\xB5\xA6\xB5\xCF\xBA\x11\xB8\xD1\xBA\x13\xB8\xD3\xBA\x15\xB8\x4D\xBB\x57\xB8\x18\xB8\x34\xB8\xC0\xB4\xB2\x8C\x56\xBB\x4F\xB0\xBF\xA4\x60\xB8\xC8\x9F\xF1\xB9\x96\xBB\x36\xB5\x98\xBB\x08\xBA\x9A\xBB\x19\xBB\xB5\xA9\x82\xB5\x1E\x93\x1C\xB7\xBC\xB5\x1E\xB7\xBE\xB5\x56\xB6\xC0\xB5\xAB\xB3\xC2\xB5\x6F\xB2\xC4\xB5\x71\xB2\xC6\xB5\xB1\xB3\x4B\xB5\xAD\xBB\xDB\x93\xBA\xB0\x1C\xB4\xDA\xB4\xEE\xAE\xAC\x83\x13\xB0\x44\x8D\x7D\xB8\x3D\x8E\xD5\xBB\x4D\x9C\x46\x7D\x3C\x0F\x4B\x7D\xF6\xB8\x6C\x7D\x15\xA1\x2C\x0D\x6B\x31\x5F\xB9\xBC\x18\x73\x7D\x58\x01\xE0\x6E\x0F\x1B\x6E\x00\x06\x98\xCB\x6B\x6E\xAB\x87\xA1\x3F\xAC\x01\x01\x60\x7D\xF8\xB8\xB4\xAA\x45\xB9\x53\x8D\x4C\xAD\x03\xAC\x07\xA0\x15\x7D\x7A\xAB\x79\x6B\xA9\x67\xF2\xBB\x12\xB9\x7C\x6C\x4E\xAC\x0E\x9A\xFE\xBB\x2A\xB9\x72\x7D\xFE\xAB\x56\xAC\x15\x71\xAF\xAC\xE1\xAC\x81\xAC\x1D\xA0\xC7\x90\x03\xBC\x48\xB9\x59\x1A\xE7\xAB\x24\xA0\x64\xAC\x41\xB9\x46\xAC\x41\xA0\x67\xAC\x9F\xAB\xDE\xAB\x7E\x8E\x6B\xAC\xE6\x65\x0E\xBC\xA2\xB9\xE1\x1A\xAA\xAB\x46\x2A\xAC\xAB\x99\xAC\x19\xA5\x9B\xAC\x0A\xBC\xE0\x8D\xB1\xAB\x0D\xBC\xD8\x8D\x54\xAC\x7C\xAC\xFF\x8D\x1A\xB6\xC3\xAC\xCE\xAB\x19\xBC\x9D\x8D\x1B\xBC\xB9\x69\x1D\xBC\xC4\xB9\x10\xBC\x06\xBC\x8D\x0E\xBB\xAB\xE2\xAC\x8C\xAC\x28\xA5\x28\xA0\x71\x0F\x90\xAC\xFD\x8F\x5C\x0A\x35\xBC\xDA\xB9\x05\xBC\xF5\x81\x98\xAC\xCB\xAB\x59\xAC\xDC\xAB\x18\xBC\x69\xAC\xDF\xAB\x0E\xA5\xD7\x74\x71\x6D\x43\xBC\x26\xBA\xE0\x1B\x11\xBC\x51\x67\xE9\xAB\xC2\xAC\xBA\x8E\x6B\xA0\xC2\x8D\x33\xBC\x42\x6A\x51\xBC\x58\xBA\xF3\x18\x54\xBC\x3F\x14\x6B\xA5\x57\xBC\xF3\x90\xA6\xAC\x7B\xA0\xAE\xA6\x5D\xBC\xA6\xBA\x82\x8D\x38\xBC\x81\xA0\xBC\xAB\x3C\xBC\x25\xBC\x3E", "\xBC\xFF\x00\x7F\xA5\x09\xA6\x42\xBC\x2A\xBC\x04\xB1\x67\x8D\x97\x68\x22\x91\x23\xBC\xAE\xAB\xB0\xAC\xB0\xAB\x4E\xAB\x8C\xA5\xCC\xAC\xF6\x66\xF3\x8D\x1F\xA8\x19\xAC\x02\x96\xD1\x99\x34\xBC\x82\xBC\xEF\x8D\x20\xAC\x7B\xAB\x5C\xBC\x88\xBC\xA0\xA1\x8D\x63\x86\x7B\x4F\xAC\x8C\xBC\x77\xB8\xF4\xB7\xE6\x90\x8E\xA9\xE0\xAC\xFB\x8D\x24\xB9\x31\xB5\x6F\xAB\xFE\x9F\xFD\x1D\x8D\xBC\x9F\xB9\xAE\x9B\xF4\xA4\x0E\xAC\x18\xAC\x71\x0F\x48\xAC\x86\xBC\x42\x6A\xED\x66\x1E\xBC\x03\x90\x37\x65\xC7\x90\xA8\xBC\x36\xBC\x2A\x1B\xBF\xAC\x67\x05\x57\xAC\x48\xBC\x9A\xAC\x4A\xBC\xF8\xBB\x8A\xA5\x8D\x63\x92\xAB\xA9\xAC\xFC\x27\x75\xBC\x0D\xB1\x62\xAC\x9A\xAB\x13\xBC\x73\xAC\x7D\xA5\x38\x70\xAC\xBC\xBC\xBC\x15\xB1\x01\x75\x72\xAC\x09\xBC\x70\xBC\xB2\xAB\xBA\xBC\x6B\x7D\xC5\x8D\x92\x8E\x33\xA5\xC1\xBC\xA6\xAC\x83\xAC\x73\xBC\x9D\xBC\xCE\xBC\xCF\x8D\xA1\x8E\xC9\xBC\x8E\xAC\x3F\xBC\xC4\xBC\xD6\xBC\x5A\xA0\x47\xBC\x6D\xBC\xA0\x98\xB5\xBC\x80\xAC\x27\xBC\xFF\x00\xF6\x90\x93\xAB\xAD\xBC\x44\xBC\x37\xBC\x69\xA5\x5D\xA5\x69\x71\xD9\xBC\x7D\x8E\xEE\x74\xDC\xBC\x1C\xB4\x60\xBC\xF3\xAB\x98\x90\x63\xBC\xA5\xAC\xCF\xAB\x8E\x10\x66\xBC\xE7\xBC\xC5\xBC\xE7\xB4\x61\x70\x1B\x6B\xB8\xAC\x7A\xBC\xBA\xAC\x7C\xBC\xC0\xAB\x72\xBC\x91\xAC\xCC\x69\xE8\xBC\x52\xBC\x45\xBC\x85\xA5\xDB\x8D\xD1\xBC\xF8\xBC\x19\x75\x7F\xBC\x22\x74\xFB\x69\x08\xBD\x5E\xBC\x4F\xAD\xAF\xB5\x8D\x63\x94\xA5\x2A\xA7\x71\x6D\x13\xBD\x69\xBC\x4D\x90\x6D\xB1\x17\x96\xED\xB4\xA7\xBC\x9E\xBC\xD6\xAC\xA2\xA5\x91\xBC\x1A\xBD\xF8\x87\x1B\x9F\xAA\xA5\x58\x6B\x20\x9F\xBF\xAB\x8C\x6E\xCA\x6F\xE1\x76\x1B\xBD\x22\xAD\x35\x65\x84\x7D\x07\x2E\x5D\xB8\x97\x18\xE7\xBB\x35\x62\x21\xBC\xB8\x2D\xB6\x02\xF3\x66\xE1\x76\xCC\x00\xB3\xA5\x5C\xB2\x44\xB9\xFD\xAC\x8A\xBC\x87\xAC\xD8\x72\x74\x7D\x38\x0B\xAE\x2D\x7A\xB2\xDB\xB7\x7F\x05\xF8\x9A\x6F\x7D\x51\xB5\x70\xB1\x7F\x88\x26\x65\x9C\xBC\xDD\x66\x22\xBD\xBD\xAA\xF6\xBB\xD4\xB1\x2C\xBD\x47\xAC\x86\x74\x1B\xAC\x53\xBD\x99\x93\x01\xBC\xAE\xA6\x81\x7D\xF3\xBB\x55\x7D\x38\xBC\x8B\xAB\x3B\xBC\xE1\xBC\x7F\xAC\xF6\xAB\x0D\xA5\x76\xAC\x0F\xA5\x42\x6A\x60\xBD\xFF\xBB\xEA\xBC\x5A\xA0\x7B\x8E\xEE\xBC\xCA\x8E\x1A\xBC\x4E\xBC\x7F\x8D\x45\x73\xDD\xBC\x54\xAC\xC8\xBC\xF6\xBC\x43\xA0\xA6\xAC\xCB\xBC\xD4\xBC\x5C\xBD\xF2\xBC\xCF\xBC\xBA\xAB\x08\x9B\x2D\xBC\xBD\xAB\xE2\xBC\x68\xBD\x3A\xA5\xD8\xAC\x6E\xA0\xFB\x69\x6D\xBD\x04\xBC\x6F\xBD\x54\xAC\x89\xAC\x0D\xBD\x31\xBC\xD0\xAB\x75\xBD\x85\xBC\x5C\x0A\x8D\xBD\x0F\xBC\xAF\xBC\xAA\x8E\x52\xA5\xEB\x6A\x7B\xBD\xC4\xAC\x0E\xBD\xE5\xBC\xC7\x90\x98\xBD\xA9\xBC\x36\xBD\xF2\xAB\x9E\x08\xA2\xAC\xB9\xAC\xAD\x8E\x88\xBD\x02\x91\x5B\xBC\x71\x6D\xA3\xBD\xAE\xBC\x1F\xBC\xA6\xBD\xB4\x04\xAE\xAC\x9E\xBD\x30\xBC\x4C\xBC\x9B\x10\xFA\xBC\xCC\xBC\x80\x7D\xFC\xBC\x25\xB1\x6E\x72\xB7\xAC\x72\x00\x92\xBD\xB7\xBD\x0A\x75\xAD\xBD\x8C\xBD\xBC\xBD\x2F\xB1\xCD\x74\xE0\x8E\xC1\xAC\xA9\xBD\xE3\x8E\xBB\xAC\x3C\x0F\xC6\xAC\x19\xBD\xC5\xBD\x99\x93\x99\xBC\x48\x0F\x18\xBD\x49\xAC\xD1\xBD\x1C\xB4\x70\x80\x9B\xA5\xD0\xBD\xCC\x69\xAF\xBD\xE9\xBC\x4A\xB0\x6A\x6A\xCF\xB0\x25\xBD\xD7\xBD\xC2\xB8\x20\x6C\x28\xBD\x32\xAC\x2A\xBD\x45\x91\xA2\xBC\xBD\xB8\x8D\x63\x01\x0B\x11\xBB\xD5\x73\x89\x7D\xC5\x45\x8B\x7D\xB6\x08\x8D\x7D\x34\xB8\x8E\x90\x65\x2E\xAE\x31\x4E\xBD\x64\xB1\x65\xB1\x0B\x66\x27\x01\x99\x7D\x69\x6B\x9B\x7D\x27\x01\x9D\x7D\x1C\x75\x9F\x7D\xAC\x72\x5A\xAF\xC7\x1C\x0E\x96\x32\x79\xA6\x7D\xA8\x7D\x58\xB1\xE6\x04\x08\x7A\x6D\x9A\xB2\x66\xB0\x7D\x3C\x88\xBE\x7D\x1C\x75\xB6\x7D\xAC\x72\x8B\x90\x09\x85\xD1\x7D\x62\x34\xD3\x7D\x3E\xB7\xC9\x7D\xBF\x7D\x82\x67\xE8\xA0\x53\x82\x00\x74\xBB\x0C\x73\x22\x96\x9D\x09\x01\xCA\x7D\x34\xA7\xCC\x7D\xAC\x72\xCE\x7D\x1E\x8F\x19\xBE\x30\x51\x1B\xBE\x70\xAD\xDE\xB0\xFC\xBD\x09\x01\x6D\x54\xDB\x6B\x44\xB1\x27\x01\xCF\x00\xBE\x70\x0A\x78\x82\x73\x24\xB7\xBF\xA1\x08\xBE\x01\x79\xAC\x66\x66\x55\xFC\xBB\xD5\x78\x0C\xBE\x3F\x00\x80\x75\x0F\xBE\xE7\x77\x11\xBE\x24\x8C\x2B\x69\x65\x0F\xCD\x00\x4C\x74\x87\xBB\x31\x00\xD5\x87\x31\x6C\x3C\x88\xE0\x95\x8D\x6E\x33\xBE\xE1\xBB\xBE\xB0\x73\x06\xBF\x4D\xB1\x7D\x42\xA8\xC6\x7D\x4A\x11\x6E\x01\xF8\x39\xFD\x95\x37\xBE\x39\xBE\x2B\x10\x1F\xBD\x3D\xB8\x80\x53\x40\x7D\xB6\xB8\x0E\x3A\x5C\xBE\x6D\x8F\x38\x14\x5F\xBE\x54\x9A\x2F", "\x09\x3C\xBE\x1E\x80\x3E\xBE\x60\x7F\x40\xBE\xBE\x70\x45\xBE\xC4\x70\x96\xB0\x8B\x06\xCB\xB5\x2E\x9E\x6B\xBE\x44\xA8\x34\x93\x6E\xBE\x0E\x3A\x2F\x09\x77\xBE\xE0\x76\x47\xBE\x51\x67\x49\xBE\xAF\x92\x4B\xBE\x27\x01\x4D\xBE\x37\x90\x6B\xB4\x59\xBE\x29\xB5\x6A\xBE\xCD\xB5\x5D\xBE\x6D\xBE\x19\x01\x5D\x43\x0A\xB7\x50\xBE\x32\x73\x52\xBE\xDB\xA0\xFA\xBD\x83\xBC\xA4\xBC\xD2\x6E\x9B\xBE\xF6\x6F\x9D\xA1\x06\x01\xE8\x95\x0C\x88\xEA\x9B\x0E\x73\x75\x6F\x4D\x09\x26\x3B\x06\x02\x87\x6F\x76\x7B\x27\x01\x79\x7B\x82\x7D\x71\x6D\xE5\x87\xA4\x9F\x2A\x73\x22\x8B\x25\x00\x62\x71\x52\x6F\x24\x02\xB6\x6F\xCF\xB0\xD2\x00\xE0\x99\xB1\xBE\x1E\x65\x22\x96\x1B\x9F\xB7\xBE\x8C\x01\xCD\x95\xA2\x6F\x27\x01\xD3\x00\x9F\xBE\x29\xA6\x82\xB8\x27\xB5\xFB\x69\x0B\x88\xA5\xB8\xC4\xB8\x97\xB1\x5D\xBB\x18\xBB\xA9\xB9\xC9\xB7\x49\xBA\x49\xA9\x4B\xBA\xAE\xA4\x65\xBB\x2D\xA2\x85\xB1\x27\xB9\x28\xB5\x7B\xBE\x99\xB8\xFF\x69\x9B\xB8\x79\x88\x00\xAD\xFE\xA9\x8E\x10\x15\xB5\x40\xBA\x00\x88\x73\xBB\x9A\xB5\x75\xBB\x04\xB2\xE3\xBA\x2D\xAF\x79\xBB\x1B\xB7\x7B\xBB\x1D\xB7\x7D\xBB\x1F\xB7\x7E\xB6\xB0\xB9\x74\xB9\xB2\xB9\xEF\xBA\x51\xB8\xA9\xBB\x53\xB8\xAB\xBB\x0B\xB5\xC9\xB5\x8D\xA7\xFD\x9B\xDF\x9B\xB8\xB8\x91\xA7\xBA\xB8\x93\xA7\xBC\xB8\x0E\xA1\xBE\xB8\x38\x8F\x0A\x99\xCC\xBE\xE4\xBD\x8D\xB1\xDE\xBA\xF3\xB9\xE0\xBA\x99\xBB\x76\xBB\x5F\xBA\x78\xBB\x2F\xBA\x7A\xBB\x63\xBA\x7C\xBB\x10\xBA\xAE\xB9\x43\xBB\xF5\xBE\x45\xBB\xD1\xB7\xF8\xBE\xB4\xB9\x27\xBB\xB6\xB9\x3D\xBA\xB8\xB9\x89\xBB\x89\xB7\x4E\xB5\x4B\xAD\xD4\xB1\xF9\xBD\x50\xAD\xB6\xA7\xC4\xB6\x0B\xBF\x61\xBD\x0D\xBF\x5A\xBA\xBF\xBA\x16\xBB\xEA\xBE\x35\xAD\x80\xB5\xBF\xBB\x46\xB8\xB7\xAE\x9F\xBB\xF7\xB2\xA1\xBB\x0D\xB6\x21\xBB\x9A\xB6\x1D\xBF\x75\xB9\x83\xBB\x17\xBA\x85\xBB\x19\xBA\xFC\xBE\x1B\xBA\xD0\xBB\x2F\xB5\x70\xB5\xD7\xA7\x36\x19\xD9\xA7\xE5\xBB\x27\x7B\xF4\xB8\x6C\xB6\xCB\xBE\xE8\xBE\xF7\xB6\x5D\xBA\x12\xBF\x3B\xBB\x14\xBF\xC5\xBA\x30\xBA\xD4\xBE\x31\xAE\xD6\xBE\xD5\xA4\xD8\xBE\x71\xA2\x67\xBB\x2F\x98\x0E\xB9\x51\xBF\xCC\x69\x2E\xBF\x6E\xBD\xA3\xB9\x31\xBF\x38\xBB\xBC\xBB\x56\xBF\x9B\xBB\x3C\xBB\x4B\xB7\x98\x9B\x65\xBA\x7C\x94\x81\xBB\xCE\xBA\xCA\xBB\xD0\xBA\xCC\xBB\xD2\xBA\xC7\xB5\xD4\xBA\x48\xBF\xD6\xBA\x36\xB2\x20\xA8\xA1\xB8\xCA\xBE\x65\xBF\x53\xBF\xC5\xB8\x98\xBA\xE1\xB9\x32\xB9\x9B\xBA\x34\xB9\x6E\xB8\x36\xB9\x38\xB7\xA0\xBA\x2E\xB8\xA2\xBA\x5C\x89\xFE\xBE\x51\x96\x01\xBF\x20\x8F\xE7\x76\xCF\xB5\xCA\xA1\xD1\xB5\x41\xBD\xD3\xAD\xE6\x65\x66\xBF\x8E\xBD\x68\xBF\x40\xB8\x86\xB3\x84\xBF\x79\xBA\xBD\xB3\x4B\xAF\x6F\xBF\x18\x9C\x71\xBF\xA1\x94\x73\xBF\xEE\xBA\x42\xBF\x87\xBA\xFA\xBE\x6C\xBA\x23\xBF\x6E\xBA\xB3\xB3\xDE\xBE\x65\x72\xE4\xA1\x0B\x0D\xF3\xB5\x3E\xB6\xE6\xA8\x56\xA2\x7E\xB2\xE4\xB2\x80\xB2\xFA\xB5\x82\xB2\x9A\xBF\x82\xBF\xCF\xBE\xA0\xBF\x48\xB7\xA2\xBF\x3A\xB0\x25\xB4\x4C\xB7\x40\xB4\x66\xBA\x22\xB7\x63\x95\x71\xBE\x4A\xBB\xAE\xBF\x8B\xBA\xB0\xBF\x0D\xA1\x6E\xBC\xFE\x9C\xA1\xB2\x80\xB9\xE0\xAA\x12\xA2\x83\xB9\x9B\xBF\x99\xBD\xC3\xB8\x74\xB7\xE9\xBE\x55\xBF\xEB\xBE\x77\xBB\xE4\xBA\xEE\xBE\xE6\xBA\xC2\xBB\x7B\xB7\xBD\xB5\x7D\xB7\xBF\xB5\x7F\xB7\xA5\xBB\x68\xBA\xA7\xBB\x6A\xBA\xAC\xBF\x89\xBA\xCD\xBF\xF4\xBA\x7B\xBF\x01\x98\x95\xB9\xF2\x69\x97\xB9\xB6\xBF\xF5\xB5\xB8\xBF\x67\xB6\x7F\xB2\x3A\xA2\x8E\x10\x2B\x9D\x94\xBB\x06\x01\xD8\xBF\xA4\xBD\x3D\x89\x69\xBF\x74\xBB\xDD\xBF\x35\xBF\x91\xB6\x1A\xBB\xB1\xB6\x9E\xBB\x3F\xBB\x1E\xBB\x3C\xBF\x2F\xB6\xA3\xBB\x31\xB6\x40\xBF\xF7\xBE\xAA\xBF\xF0\xBA\x21\xBF\xF2\xBA\xEF\xBF\x2A\xBB\x25\xBF\xAE\x8F\xBD\xB4\xB0\x8F\x4C\x1F\xB2\x8F\x3D\xB6\xDB\xAA\xB7\xBF\x6E\xA8\xB9\xBF\x7C\x87\xF9\xAD\xBA\x8F\x6B\xB6\xE8\xB2\xB9\x69\x00\xC0\xB0\xBD\xE4\x88\xCE\xBE\xBA\xB1\xD0\xBE\x69\xB9\x57\xBF\xE0\xBF\x15\xBF\xEF\xBE\x17\xBF\xF1\xBE\x19\xBF\x81\xBA\xEB\xBA\x83\xBA\xED\xBA\x38\xBA\x1F\xBF\x3A\xBA\x44\xBF\x3C\xBA\x46\xBF\xEE\xB5\x19\xC0\x59\x8F\x6D\x6D\x78\x9D\x0F\xB9\x2A\xC0\xDE\xBD\xDA\xBF\x95\xBA\xAB\xBA\x97\xBA\xF5\xB9\xAF\xBA\x03\xBB\xF8\xB9\x1B\xB9\xB3\xBA\x1D\xB9\xB5\xBA\x1F\xB9\xD2\xB9\x21\xB9\xB9\xBA\x56\x81\xEE\xB9\x0E\x93\x48\xC0\x09\xBD\x7A\xB5\x4B\xC0\x32\xBF\x4D\xC0\xE7\xB7\x02\xBB\x19\xB9\x51\xC0\x52\xB9\xFA\xB9\x54\xB9\x8F\xB9\x56\xB9\xB7\xBA\x58\xB9\x59\xC0\x58\x86\x02", "\xBA\x90\xBA\x02\x01\x5D\xC0\x14\xBD\xC5\xB9\x03\xC0\xDC\xBF\xE1\xBA\xDE\xBF\x13\xBF\x32\xC0\x59\xBF\x16\xBF\xC7\xBA\x0C\xC0\x41\xBB\xCA\xBA\x1B\xBF\x36\xBA\x3B\xC0\x85\xBA\x13\xC0\xF9\xBE\x77\xBF\xAA\xBB\x79\xBF\xAC\xBB\xCF\xBF\xB7\x6C\x0D\xB7\x49\xB0\x62\x7A\xDD\xB6\xC8\x90\x5A\xA9\xE7\xBE\xB9\xBB\xB5\xB5\xC8\xB9\x76\xAA\x4F\xB9\x3C\xB4\xE3\xB9\x35\xB7\x9D\xBA\x6F\xB8\x8B\xBF\x38\xB9\xE9\xB9\x3A\xB9\x97\x85\x69\xB3\xEA\x7B\x94\x92\x73\xC0\x1C\xBD\xDB\xB9\x9E\xBF\xBA\xB3\x4E\xC0\x99\xBA\xAB\xB8\xA3\xBF\xC5\xBF\x70\xBF\xC7\xBF\x72\xBF\xC9\xBF\x06\xA2\xCB\xBF\x86\xBB\x17\xC0\x4C\xBB\x8C\xC0\x7C\xAF\x54\xB7\x2B\xC0\x60\xB9\x0F\xA3\x7F\xB3\x64\xBF\x5C\x0A\xA7\xC0\xF8\xBA\x59\xBA\xAA\xC0\xAD\xB7\xAD\xB2\xAD\xC0\x8A\xB9\x66\xC0\x8C\xB9\x53\xC0\x8E\xB9\x55\xC0\x90\xB9\x57\xC0\x92\xB9\xEB\xB9\x2D\xB2\x08\x99\x32\xA3\x47\xC0\xBF\xBF\x2E\xC0\xC1\xBF\x43\xB8\x5B\xB0\xF5\x79\x1B\xBB\x5E\xB0\x3A\xBF\x96\xB6\x80\xC0\xA2\xBB\x3E\xBF\xA4\xBB\xC8\xBB\xA6\xBB\x75\xBF\xA8\xBB\x88\xC0\xFB\xBE\x8A\xC0\x55\xB8\xF1\xBF\x29\xB7\x9B\x10\x53\xA3\x0A\xBF\xD8\xC0\x64\xB2\xDA\xC0\x8A\xB8\x47\xBA\x97\xB7\x06\xBB\x8E\xB8\x63\xBB\x05\xB9\x5F\xBF\x92\xA2\x61\xBF\x74\xA3\xD2\xBB\x0C\xBF\x48\x99\xCB\xB3\x05\x90\x92\xA9\xC3\xC0\x5B\xBB\x23\xB8\x30\xB7\x69\xB8\xC9\xC0\xB0\xBA\x87\xBF\xCD\xB9\x89\xBF\xCF\xB9\x9F\xC0\xD1\xB9\xA1\xC0\xD3\xB9\xD3\xC0\x48\x9E\x93\xAF\xD4\x23\x5C\xC0\xF3\xC0\x46\xB7\xF5\xC0\xC7\xB8\x04\xBB\x01\xB9\x61\xBB\x4A\xBA\xFB\xC0\x4C\xBA\xFE\xB9\xCF\xB8\x00\xBA\xC3\x7F\x1D\xAA\x71\x0F\x1F\xAA\xF4\xB4\x00\x00\x07\xC1\x54\xB4\x5C\xBB\x1D\xC1\x46\xBA\x1F\xC1\x48\xBA\x21\xC1\xD5\xBE\x23\xC1\xD7\xBE\x25\xC1\x4E\xBA\x27\xC1\x49\x8F\x0E\xBB\xE6\xAE\x73\x9A\xD4\xA3\x03\xBA\x2E\xC1\xC9\xB4\x30\xC1\xAC\xC0\x85\xBF\x9A\xBA\x9B\xC0\x9C\xBA\xAE\xB8\x9E\xC0\xB0\xB8\x8C\xBF\xB2\xB8\x8E\xBF\xD6\xB4\xA4\xBA\xBC\xC0\x49\xC0\x5E\xB8\x32\xB4\x9E\xB9\xF5\xBB\x71\x6D\x42\xC1\xF0\xB4\x77\xB1\x87\xB8\x10\xBF\x6B\xBF\x79\xC0\x31\xC0\xED\xBE\x33\xC0\xE2\xBF\xF0\xBE\xC3\xBB\xF2\xBE\xC5\xBB\x7F\xBB\xC7\xBB\x58\xB6\xC9\xBB\xAD\xB3\xCB\xBB\xAF\xB3\xCD\xBB\x06\xBE\x18\xC0\xEE\xC0\x5C\x90\x4F\xBB\x30\xB4\x51\xBB\x3F\x0F\xDD\xB7\x66\x7A\xF8\xB5\xD5\xBF\x33\xBB\xD7\xBF\x1B\xC1\xDD\xB8\x17\xB9\x64\xC0\x73\xB4\x5F\xBB\x9E\xB5\x5B\xBF\x4A\xB2\x5D\xBF\xF6\xA9\xFD\xC0\x63\xA4\xFF\xC0\x24\x9B\x74\xC1\x0E\xB7\xB9\xA4\x29\xB0\x4A\x9F\x40\xA4\x92\xAA\x7A\xC1\x9A\xB0\x4F\x9F\x62\xB9\x12\xBB\x58\xC1\x7E\xC1\xBB\xBB\x2F\xC0\x3A\xBB\x6D\xBF\x58\xBF\x9D\xBB\x1C\xBB\x0B\xC0\xA0\xBB\xE2\xC0\x3D\xBF\x82\xC0\xCC\xBA\xE9\xBF\x82\xBB\xEB\xBF\x48\xBB\xED\xBF\xCC\xBF\x41\xC0\x24\xBF\x72\xC1\xD9\xB7\x78\xB8\xB3\xBB\x17\xAC\x79\xB8\x76\x8E\x50\x90\xA8\xB4\x75\x9F\x56\xC1\x55\xBD\x99\xC1\x95\xC0\x24\xB6\x97\xC0\xC2\xAA\x99\xC0\xCB\xB9\x0E\xC1\xB2\xBA\x10\xC1\xB4\xBA\x12\xC1\xB6\xBA\xD1\xC0\xB8\xBA\x16\xC1\x62\xB4\x1B\xC0\x6B\x95\x8F\xC0\x8F\xC1\xF7\xBF\xC0\x99\x8F\xBB\x94\xC1\x47\xAE\x3A\xB8\x7D\xC1\xBD\xC1\x8D\xB6\xBF\xC1\xED\xAC\x18\xB9\x82\xC1\xF7\xC0\x8C\xB8\xF9\xC0\xE4\xB8\x37\xC1\x5E\xBF\x39\xC1\x0B\xBB\x3B\xC1\x73\x87\xAF\xBB\x2D\xBB\x66\xBE\xBB\xA4\xB2\xBB\x75\xC1\x57\xBB\x83\x9B\xB6\xBB\xC1\xA4\x42\x6A\x59\xC1\xB3\xC1\x1A\xB5\x4E\xB9\xDC\xC1\xFD\xB4\x83\xC1\xAA\xB9\x85\xC1\x16\xB3\x87\xC1\x68\xAD\x89\xC1\xB4\xA8\x8B\xC1\x2E\xB4\x3D\xC1\xA8\x9B\xD4\xBB\xC2\xB0\x9C\x7F\xD7\xBB\xDD\xB4\xD9\xBB\xAC\x83\xDB\xB4\xD3\xBD\x8D\x63\x9C\x90\x7A\x7B\x42\x6A\x31\x73\xBD\xC0\x76\xC1\x99\xBF\x52\x09\xA1\xBC\x03\xBD\xA3\xBC\x5A\x8E\x5A\xBD\x80\xBC\x02\x8E\x5D\xBD\xAB\xBC\xC4\xBD\xCC\x69\x12\xC2\x53\xC1\xA5\xBD\xD7\xBC\xF5\x71\x08\xBC\xB5\xBD\x68\xAC\x04\xAC\x71\x8E\xC7\x90\x22\xC2\x5E\xC0\x9A\xBD\xEB\xBC\xBF\xBC\xAF\x69\x72\xBD\x53\xA0\xC3\xBC\x20\xC2\x5C\x0A\x2D\xC2\x74\xC0\x8F\xBD\x76\xBC\x84\x8D\x25\xA5\x44\x70\x28\xC2\x4B\xBC\x2A\xC2\xD1\x90\x36\xC2\x55\x32\xC6\xBD\xAF\x74\xBE\x74\xD0\xBC\x33\xC2\x59\xBC\x59\x70\x43\xC2\x1D\xC2\x81\xBD\x25\xC2\x6D\x0C\xCA\xAB\xE0\xBC\xD8\x90\x3D\xBC\xDA\xBC\xAC\x8D\x2C\xC2\x45\xC2\x35\x91\x3A\x07\xDF\xBC\x65\xBD\x53\xC2\x6F\xBC\x55\xC2\xE6\xBC\xBA\xBD\x5E\x4D\x58\xC2\x00\x75\xBE\xBC\xE8\xAB\xA8\xBD\x01\xBD\xAA\xBD\xCD\xBD\xAC\xBD\x95\xBD\x62\xA0\xFB\x69\x38\xC2\xA8", "\xC0\x0A\xBD\x54\xAC\xC7\x8D\x49\xC2\x74\xAC\xCB\x8E\x4C\xC2\x74\x32\x63\xC2\x7A\xAC\x3A\x07\xD0\x8D\xC0\xBD\x74\xC2\xC2\xBC\x05\xAC\x77\xC2\xFD\x3A\x79\xC2\x44\xBD\x7B\xC2\x0C\xBD\x7E\xC2\xC5\xAC\x10\xBD\x21\xAC\x6E\xC2\x54\xBD\xEB\xBD\x84\xBC\x6D\xC2\xA6\xBC\x71\x6D\x6F\xC2\xC4\xC0\x1D\xBD\x16\x65\xDA\xBD\xD6\xBD\x21\xC2\x8C\xC2\x29\xC1\xA3\x9A\x57\xC2\x93\xBC\xE2\xB0\x09\x8F\x85\xB2\x97\xBC\x9F\xC2\xF2\xB4\x26\xB9\x1B\x8F\x42\x6A\x07\x8E\xD8\xC1\xAA\xB6\x9B\xC1\x31\xC1\x5E\xBB\xDE\xC1\x60\xBB\xE0\xC1\x62\xBB\xFC\xB9\xCD\xB8\xE4\xC1\x66\xBB\x26\xB5\xDB\xBE\x8C\xA7\x91\xBF\x8F\xA7\x02\xBF\x2C\xB5\x11\xB5\x0D\xBF\x72\x91\xE7\xA0\xC0\x9B\xC4\xB6\xA7\xC2\xCD\xBE\xDB\xBF\x54\xBF\x78\xC0\x06\xC0\xEC\xBE\x06\xB2\xE5\xBA\x6D\xB9\xE7\xBA\xAC\xB9\xE9\xBA\x11\xBA\xE7\xBF\x13\xBA\xA8\xC1\x74\xBF\x6C\xC1\x76\xBF\x6E\xC1\x78\xBF\xCE\xBB\xA9\xB1\x90\xBF\x8F\xBE\xCC\x6C\x7D\xBE\x0B\xA1\x2E\xB5\x7C\xBF\x19\xC2\x98\xA7\x03\xBA\xC2\xC2\x02\xC1\x5B\xC1\x06\xBA\xDA\xC1\x0B\xAD\x0C\xC1\x50\xC0\xB1\xBA\x52\xC0\xC5\xC1\x54\xC0\xC7\xC1\x56\xC0\x14\xC1\x58\xC0\xCB\xC1\x9F\x90\x27\x9C\xAB\x88\x41\x8F\x4E\xBF\x53\x9B\x2B\xBF\xD9\xB8\x0A\x99\xE4\xC2\x2F\xBF\x02\xC0\xC6\xC0\x24\xB8\x78\xBA\xC2\xBF\xB0\xB7\xAF\xC0\x29\xB8\xC6\xBF\x2B\xB8\xC8\xBF\x4F\xB7\x9F\xB4\x51\xB7\xA1\xB4\xAD\xA3\x42\x63\x71\xB5\x4C\xBF\x74\xAD\xF9\xC2\x97\x7E\xF7\xB1\xA0\x89\xC1\xC0\x27\x01\xFE\xC2\x67\xBF\x4A\xC0\x0E\xBF\x43\xBA\xE8\xC2\xB7\xAD\xA1\xBF\x05\xC3\xC4\xBF\x07\xC3\xB1\xC0\x09\xC3\xB3\xC0\x0B\xC3\x23\xB7\xA0\xB4\x1A\x94\xBA\xC0\x2E\x93\x72\x9C\x92\xA9\x1A\xC3\x9C\xBF\x1C\xC3\x76\xC0\xC5\xC2\x11\xBF\x5F\xC1\x9E\xC1\x7B\xC0\xA0\xC1\xDF\xC0\xA2\xC1\x3B\xBF\xA4\xC1\x0E\xC0\xE4\xC0\x10\xC0\x84\xC0\x24\xBB\x3D\xC0\x26\xBB\x3F\xC0\x28\xBB\xB8\xC0\x88\xBB\xB0\xC1\x87\x94\x2B\x69\x2E\x97\x71\xC0\x01\x01\x30\xC3\xD9\xBF\x2C\xC0\xC4\xC2\x83\xBF\x45\xC1\x21\xC3\xE2\xB9\xAC\xB8\x9C\xC0\x4A\xC1\x8A\xBF\x4C\xC1\xA0\xC0\xA1\xBA\xA2\xC0\x0E\x78\x3C\xB9\xFE\x9B\xBA\xC2\x3F\xB9\xCE\xAD\x14\xBC\xEF\xC0\x48\x0F\x71\x8F\xFE\xBF\x03\x01\x4F\xC3\x01\xC0\xE6\xC2\xFE\xBA\x62\xC0\xFD\xB8\x4F\xC0\x65\xC0\xEC\xC2\x67\xC0\xCD\xC0\xFB\xB9\x6A\xC0\xFD\xB9\x57\xB9\xFF\xB9\x59\xB9\xD4\x9C\xF1\xAD\x6A\xA8\x95\x89\xBC\xB9\xF6\xAD\xF7\xB5\xD4\xBF\x95\xC1\x61\xB9\x98\xBF\x20\x84\xA9\x67\x6B\xC3\x13\xC2\x6D\xC3\x15\xBB\x6F\xC3\x80\xC1\x71\xC3\xDD\xC1\x33\xC1\xF8\xC0\x68\xC0\x07\xBB\xB1\xC2\x09\xBB\xB3\xC2\xD9\xBE\xE6\xC1\xD1\xB8\x16\xBC\x1B\xB6\x2D\x6D\xD4\xC1\xC2\xB2\x1F\xB6\x86\xC3\x52\xB0\x5C\x0A\x89\xC3\x23\xC2\x00\xC3\x5C\xC1\x74\xAE\xAB\xC2\xD1\xBE\xF9\xC1\xD3\xBE\x35\xC1\x5C\xBF\xE2\xC1\x88\xC1\x97\xC3\x60\xBF\x99\xC3\x13\x91\xF3\xBF\xB5\x05\xF5\xBF\x20\xC0\xD1\xC1\x66\xB6\x82\xC3\xFA\xBF\x25\xC0\xFC\xBF\x83\xB9\xA4\xC3\x2E\xC2\x32\xC3\x01\xC3\x0A\xC1\x03\xC3\xDB\xC0\x36\xBF\x37\xAD\x38\xBF\x6C\xAF\xE3\xBF\xE8\xBA\xE5\xBF\xEA\xBA\xD0\xC2\xEC\xBA\xD2\xC2\xA9\xBF\xAA\xC1\x84\xBB\xAC\xC1\xB7\xC0\xAE\xC1\xAF\xBF\x3D\xB7\xB9\xC2\x68\xA8\x4E\x9D\x62\xB6\x04\x93\xE9\xC1\xDC\x92\x40\xB6\xBE\xB9\x5A\xC1\xB4\xBB\x26\xC0\xC1\xB9\x2F\xC3\x9A\xC1\x33\xBF\x05\xC0\xAC\x98\xC7\xC3\xB5\xAE\xC9\xC3\x83\xB5\x48\xB8\x85\xB5\x0D\xC0\xB6\xB6\xA6\xC1\x22\xBB\x41\xC3\x46\xBB\xD3\xC3\x43\xBF\xD5\xC3\x45\xBF\xEC\xC0\x47\xBF\x2C\xC3\x38\x7E\xD6\xB9\x55\x8A\x98\xB3\x19\xC3\xE8\xC3\x8D\xC3\xC9\xB9\xC1\xC1\x44\xB8\x37\xBF\xDE\xC0\x09\xB6\xF0\xC3\x0B\xB6\xF2\xC3\x20\xBB\xF4\xC3\x3F\xBF\xF6\xC3\x1E\xBF\x86\xC0\x20\xBF\x45\xC3\x22\xBF\xD7\xC3\xCE\xBF\xD9\xC3\x23\xA9\x97\x9D\xC4\x8D\x0F\xB9\xC0\xC3\x39\xC2\x9D\xBF\xA7\xC3\xD9\xAF\x9C\xC1\xBD\xBB\xD2\xBE\x62\xBA\x7E\xC0\xA3\xC1\xCE\xC2\x1A\xBF\x39\xC0\x44\xBB\x12\xC4\x41\xBF\xF8\xC3\xAB\xBF\xEA\xC0\xAD\xBF\x18\xC4\xF0\xBF\xFE\xC3\x0D\x7F\x70\xC0\xF1\xB6\x03\xC4\xA8\xC2\xE2\xB6\xAA\xC2\x54\xC3\x04\xC3\x56\xC3\x06\xC3\xE4\xB9\x08\xC3\x9E\xBA\x0A\xC3\xB1\xB8\x0C\xC3\xB3\xB8\x52\xB7\xBA\xB7\xD8\xBD\x9A\x93\xD6\x9D\xD8\xA2\x3A\xC4\xC3\xC2\x60\xC0\x6A\xBF\x24\xC4\x6C\xBF\xBE\xBB\xC8\xC3\x0A\xC4\x47\xB8\xE0\xC0\x49\xB8\x2A\xC4\x38\xC0\xCF\xC3\x3A\xC0\xD1\xC3\x3C\xC0\x14\xC4\x3E\xC0\xFA\xC3\x40\xC0\xFC\xC3\x3E\xBA\xA4\xC0\x97\x80\x94\x92\x1F\xC4\x70\xC2\x5F\xC0\x1D\xC3\x96\xBA\x1F\xC3\x09", "\xB4\xEA\xC2\x72\xC3\xC3\xC1\xED\xC2\x9D\xC0\x5A\xC3\xE7\xB9\x5C\xC3\x8D\xBF\x5E\xC3\x30\xB8\x53\xB7\x01\xC1\xFF\xC2\xEE\xC1\x10\xB7\xBB\x3E\x0E\x93\x6A\xC4\x93\xC2\xA9\xC0\x22\xC4\x79\xB1\x3E\xC4\xC6\xC3\x07\xC0\x09\xC4\x09\xC0\xA1\xC1\xCC\xC2\x7F\xBA\x5B\xC4\x42\xBB\x2C\xC4\x1C\xBF\x2E\xC4\x12\xC0\x30\xC4\x14\xC0\x16\xC4\x16\xC0\x34\xC4\x71\xC1\x36\xC4\x96\xA3\x2A\xB7\x41\xAF\x18\xC3\x09\x01\x83\xC4\x08\xC1\xA6\xB8\x05\xC4\x98\xC0\xF7\xC1\x5F\xB5\xAB\xC3\x27\xC4\xFB\xC1\xDC\xB3\xFD\xC1\x5D\xAE\xFF\xC1\xC3\xA9\x01\xC2\x3E\xB7\x5D\xAF\xC8\xA9\x69\xC4\x04\xC4\x6F\xC4\xAE\xB7\x55\xC3\x86\xBF\x48\xC1\x88\xBF\x75\xC4\x11\xC1\x5B\xC3\x13\xC1\x5D\xC3\x15\xC1\xA3\xBA\x75\xB8\x01\x90\xE5\xC2\x89\x82\xA8\xBA\xE7\xC3\x3B\xC4\x2E\xB7\xA5\xC4\xC0\xC1\xA7\xC4\x50\xB9\xCB\xC0\x05\xBB\x93\xC3\xFA\xC0\x95\xC3\x64\xBB\xB1\xC3\xFE\xC0\xB3\xC3\x1C\x94\x62\x94\x8E\x9E\xA0\xC4\x06\x8E\xB6\xC4\xF4\xB9\x63\xC0\x8F\xC3\xF8\xC1\xAD\xC2\x84\xC1\xAD\xC3\x86\xC1\xAF\xC3\xFE\xC1\xD6\xC4\x8A\xC1\xD8\xC4\x60\x8F\x00\xB4\xD8\xBA\x08\x7D\xB5\xC4\xCA\xC4\x91\xB7\x3D\xC4\xE0\xC4\x71\xC4\x90\xC3\xD0\xC4\x20\xC1\xAF\xC2\x22\xC1\xD4\xC4\xFC\xC0\xE9\xC4\x00\xC2\xEB\xC4\x99\x98\x03\xC2\xE3\xC3\x0C\x7A\x3F\xC1\xD6\x9E\xF0\xC4\x50\xC4\x6D\xC4\x4C\xC0\xB7\xC4\xC8\xC0\x46\xC1\xAE\xC0\x23\xC3\x42\xC4\x25\xC3\x44\xC4\x27\xC3\x46\xC4\x29\xC3\x0D\xC3\x2B\xC3\x1A\xC4\xD3\xA2\x8E\xC0\xE5\xB2\x9B\xC2\x97\xC1\xAE\x9B\xA6\xC2\xDE\xC4\x5D\xC1\x53\xC4\x36\xC3\x55\xC4\xED\xC3\x57\xC4\x39\xBF\x3B\xC3\xE1\xC0\x90\xC4\x81\xC0\x92\xC4\x83\xC0\x5F\xC4\x85\xC0\x96\xC4\x87\xC0\xD6\xC2\x89\xC0\xD8\xC2\x8B\xC0\x17\xC5\x47\xB4\xDA\xB7\x98\xB9\x0C\xB0\x6B\xAA\xF5\x94\x14\xC3\x35\x90\xBF\xC3\x1F\xC5\xA8\xC3\x88\xC4\xF6\xC0\x91\xC3\xDF\xC1\xD2\xC4\xE1\xC1\xFB\xC4\x24\xC1\x79\xC3\x26\xC1\x7B\xC3\x0B\x8D\x8D\xC1\xCF\xC1\xF6\xB7\x3B\x0F\x53\xBB\x2C\xB0\x83\xC3\xD5\xC1\x71\x0F\x6A\xB4\x1F\xAE\xA1\xC4\x3F\xC5\x23\xC4\xA9\xC3\x30\xC0\x37\xC3\x61\xC1\x7C\xC0\x34\xC0\x28\xC4\x3C\xC3\x29\xC5\xE3\xC0\x10\xC4\xE5\xC0\x6A\xC1\xE7\xC0\xD4\xC2\xE9\xC0\x31\xC5\xEB\xC0\x33\xC5\xED\xC0\x9C\xC4\xAE\xBB\xB2\xC1\xED\xC1\xFA\xC2\x91\xAE\xED\x5E\xB7\xC1\x3C\xC5\xB9\xC1\x70\xBB\x34\xB4\xDD\xC4\xF1\xC4\x2D\xB9\xE9\xC3\xC6\xC2\xEB\xC3\x8A\xC4\x56\xC4\x8C\xC4\x3A\xC3\x8E\xC4\x40\xBB\x63\xC5\xA5\xC1\x2B\xC5\xA7\xC1\xE6\xC0\xEA\xBF\xE8\xC0\xEC\xBF\x32\xC4\xEE\xBF\x9A\xC4\xB9\xC0\x35\xC5\xA3\xB4\xE8\xC1\x4A\xBD\x65\xB6\x9C\x9F\x56\x9B\x9E\x9F\x74\x9F\x5B\x9B\x1C\xC5\x6A\x92\x4E\xC3\x59\xC5\x87\xC4\xF4\xC4\x0C\xC5\xCA\xC0\x73\xC3\xCC\xC0\xEE\xC2\xCE\xC0\xF0\xC2\xD0\xC0\xF2\xC2\xD2\xC0\xC3\xC4\xBC\xB4\xDB\xC3\xDA\xAA\xAE\x94\x42\xAC\xF4\xBC\xB8\xAA\x8E\xC1\xBE\xC0\x8E\x10\xC5\xB4\x0C\xAB\xE6\x65\xA2\xC4\x2F\xC1\x09\xC1\x5F\xB7\xAE\xBA\xF5\xC4\xE2\xC4\x43\xC5\xAE\xC2\x45\xC5\xB0\xC2\x77\xC3\xB2\xC2\x49\xC5\x3A\xC1\x4B\xC5\x0D\xBB\x52\xC1\xC1\xC3\xE5\xBD\x71\xC5\x76\x8E\x7F\xB8\xE2\xC3\x9F\xBC\xDC\x87\x2B\xAB\xDA\xBB\x06\xC2\x99\x7A\x71\xB1\xDA\x0B\x94\x92\x13\x8E\xC6\xC4\x1D\xB4\x97\xBB\x7E\xC5\x35\xC3\xC7\xC2\xDF\xBF\x5E\xC5\x39\xC3\x0B\xC4\x59\xC4\xF1\xC3\x3D\xC3\xF3\xC3\x89\xC5\xF5\xC3\x2D\xC5\x42\xC3\x61\xC4\x44\xC3\x63\xC4\x46\xC3\x91\xC5\xE2\x2E\x60\xC3\x92\xBF\x42\xBD\x8B\xB1\xBC\xC2\xDF\xC2\xA4\xB6\xBF\xC2\x72\xB1\x03\xBA\xDC\xC5\x7E\xC4\x58\xB3\xC3\xC3\xBE\xC5\x1B\xB5\x81\xC1\xC1\xC5\xF7\xC4\x34\xC1\xF9\xC4\x36\xC1\x47\xC5\x38\xC1\xC8\xC5\xE5\xC1\xE0\x76\xF5\xC5\xDA\xC3\xF7\xC5\xB9\xB8\x4C\x83\xBB\xB8\xD0\xBF\xE1\xC2\xA1\x91\xDB\xC5\xA0\xC5\x28\xB3\x5B\xC5\x9D\xC1\x23\xC5\x5C\xB0\x25\xC5\xCA\xC3\x64\xC1\xE4\xBF\xC4\xBB\xE6\xBF\xC6\xBB\xE8\xBF\x8B\xC5\xA9\xC1\x8D\xC5\xAB\xC1\x8F\xC5\xAD\xC1\x65\xC4\xAF\xC1\x6F\xC5\xAE\xB5\x43\x0F\x4F\xB5\x82\x6A\xD5\xB1\xBA\xBF\x7E\x8F\xD8\xB8\x5C\x86\x19\xC6\x7C\xC5\xA5\xB9\xE0\xC5\x5E\xC1\xE2\xC5\x7A\xC0\xE4\xC5\xA4\xBF\xC2\xA3\x37\xC0\x91\xC4\x5D\xC4\x2D\xC4\xED\xC5\xF7\xC3\x2A\xC6\xD4\xC3\x2C\xC6\xD6\xC3\x2E\xC6\xD8\xC3\xEC\xB9\xB1\xB1\x71\xAD\xD1\x96\x72\xB5\xD3\x96\x31\xBB\xC6\x7A\x50\xBF\x28\xC0\x42\x6A\xFF\xC5\x1B\xC3\x51\xC3\x51\xC4\x04\xC0\x7F\xC5\xDF\x9A\xEC\xC3\x1F\xC6\x83\xC5\xE6\xC5\x27\xC5\x5A\xC4\xCD\xC3\xCF\xC2\x26\xC6\xD1\xC2\x28\xC6\xD3\xC2\x06\xB9\x97\xC4\xF1", "\xC5\x17\xC4\x4E\xC6\x19\xC4\x50\xC6\x39\x92\x63\xBF\x59\xC6\x71\x6D\x5B\xC6\x31\xC3\x5D\xC6\x08\xC5\x61\xC0\x0A\xC5\x31\xB7\x05\xC6\xA8\xC4\xE3\xC4\xFA\xC1\xE5\xC4\xFC\xC1\xE7\xC4\xAE\xC4\xFD\xC4\xB0\xC4\xFF\xC4\xAD\xAD\x9C\xBE\xFF\x00\x4C\xC3\x39\xC4\x12\x8E\x1A\xC6\x41\xB8\x1C\xC6\x25\xC4\xA9\xC4\xC6\xBA\xAB\xC4\x9B\xB4\xF4\xBE\x2C\xC5\x6C\xC6\xD2\xC3\x4A\xC6\xF9\xC3\x4C\xC6\xFB\xC3\x6D\xC5\xBF\xA1\x10\xC6\x89\xB1\x93\xBF\x0A\x7F\x40\xB9\x13\xB5\x8E\x10\x68\xC3\x6B\xB4\x5C\x0A\x79\xC6\x50\xC3\x30\xBF\x02\xC6\xA8\xB8\xBF\xC5\xA3\xC5\x0D\xC1\xBB\xC4\x0F\xC1\xBD\xC4\xC6\xC1\xBF\xC4\xC8\xC1\xAB\xC5\xCA\xC1\xAD\xC5\x5C\x7A\x3B\xB6\xF2\xAD\xE6\xA1\x38\xC5\x7C\xB2\x34\x03\xE3\xB2\x24\xC0\x69\xB6\xBC\xBF\x1C\xC5\xFC\xAD\xAD\xC6\x6C\xC3\x01\xC6\x86\xC4\x1B\xC6\x41\xC5\x1E\xC1\x07\xC6\x92\xC3\x75\xC3\x69\xC0\xCF\xC0\x6B\xC0\xC9\xC1\x6D\xC0\xF4\xC2\x39\x91\x2E\xBC\x7F\xB9\xBC\xC3\xC7\xC6\x82\xB9\x9D\xC5\xA9\x67\xCB\xC6\x8A\xC3\xCD\xC6\xE7\xC2\xDF\xC4\x70\xC3\xC0\xC5\x81\xC6\xC2\xC5\xE4\xC4\x09\xC6\xAE\xC3\x0B\xC6\xE3\xC1\x0D\xC6\xB4\xC2\xCA\xC5\xF7\x83\xBF\xC6\x40\xAE\x23\x9D\xDF\xC3\x35\xB8\xE1\xC3\xB8\xC1\x9D\xB9\x79\xC5\x20\xB8\x90\xC6\x3B\xC6\xC7\xB9\xE7\xC6\x8E\xC3\xE9\xC6\xCF\xC4\xA5\xC5\xD1\xC4\xD4\xC6\x94\xC3\xC6\xC5\x96\xC3\xF1\xC6\x98\xC3\xF3\xC6\xE0\xA8\x61\xB6\x1D\xC0\x63\xB6\x96\xC5\x55\xA2\x22\xC0\xF9\xBF\x36\xC6\xBD\xC3\xE6\xB2\x27\xC0\x38\x86\xE6\x65\xE3\xC6\xA5\xC3\x8B\xC3\xDF\xC5\xCC\xC4\xDB\xC1\x80\xC6\x05\xC7\x73\xC4\x74\xC3\xA7\xC5\x76\xC3\xD6\xC6\x78\xC3\x6C\xC0\x7A\xC3\x6E\xC0\x71\x9C\x45\xC0\x77\xA2\x92\xA9\x1D\xC7\xCD\xC5\xAF\xC6\xCE\xC6\x92\xC6\xD0\xC6\x32\xC1\xD2\xC6\x44\xC5\x08\xC7\xD3\xC4\x0A\xC7\xD5\xC4\x0C\xC7\xB2\xC3\x0E\xC7\x52\x98\x5B\xC0\x31\xC7\x91\xC6\x9F\xBF\x37\xC7\xAC\xC2\xEB\xC6\x83\xC6\xED\xC6\xE6\xC4\xEF\xC6\xB0\xC3\x3F\xC7\xD7\xC4\x41\xC7\x76\x98\xB6\xA2\x4D\xC3\x00\x00\x32\xC7\x20\xC4\xC2\xC3\x35\xC7\x46\xC7\xA2\xC5\xB9\xC4\x47\xC1\x57\xC3\x49\xC1\xE5\xB9\x4B\xC1\x77\xC4\xC0\xC4\x79\xC4\xC2\xC4\x7B\xC4\x4A\xC4\xDD\xC5\x70\x80\x22\xBA\x55\xB3\xB2\x3B\x45\xC7\xAB\xC0\x5B\xC7\x3F\xC4\xBA\xC4\x5E\xC7\xBC\xC4\x59\xC3\xBE\xC4\x62\xC7\xBA\xC6\xC1\xC4\xF3\xC2\xD3\x78\x67\xC4\x99\x85\x3A\xC6\x07\xC5\x33\xC3\x53\xC3\x6F\xC7\x89\xC4\xC8\xC2\x29\xB6\xCA\xC2\x7D\xBA\x85\xC5\x7F\xC0\x87\xC5\x3E\xC3\x65\xC5\x40\xC3\x48\xC6\x13\xC4\x2F\xC5\x15\xC4\x70\xC6\x99\xC4\x72\xC6\x35\xC4\x93\xC5\x8C\xA9\xCC\xC5\x57\xC7\x54\xC1\x80\xC4\x10\x79\x0F\xB9\x56\xC7\x6B\xC4\x21\xC4\xE6\xC6\x20\xC5\x93\xC6\x54\xC4\x26\xC4\x96\xC6\x84\xC6\xAC\xC4\x86\xC6\x37\xAF\xAF\xC4\x35\xAA\xB1\xC4\xB8\x9D\xFE\x93\x96\xB3\x0E\x93\x9D\xC7\x84\xC4\x75\xC0\xB0\xC6\xDF\xB9\xB2\xC6\x5C\xC7\x0D\xC5\x4A\xB7\xB0\xC0\xA5\xBF\xB2\xC0\xA7\xBF\xB4\xC0\x2B\xA2\xB6\xC0\xA0\xC6\x70\xC1\x92\xC5\x74\xC6\x96\xBF\x63\x8B\x5E\xAF\xC4\xB6\xB1\xC7\xA3\xC4\x2D\xC0\xF4\xC0\x47\xC7\xAA\xC3\x82\xC6\xAC\xC3\x4B\xC7\x85\xC6\x4D\xC7\xE8\xC4\x4F\xC7\xEA\xC4\x51\xC7\x02\xC2\x97\xC7\x9E\xC7\x0B\x6E\xC8\xC4\x9C\xC7\x6D\xC7\xC7\xC0\x7F\xC6\xE1\xC4\xEA\xC6\x39\xC7\xC3\xC5\x3B\xC7\x46\xC5\x3D\xC7\xFC\xC4\xD5\xC7\xFE\xC4\xD7\xC7\xB2\xC4\x18\xC1\xBA\x79\xDD\xC7\x00\xC7\xDF\xBA\x40\xC5\x81\xC7\x42\xC5\xE3\xC7\xEC\xC6\xC4\xC5\xFA\xC4\xE7\xC7\x48\xC5\x2B\xC7\x4A\xC5\x2D\xC7\x91\x9C\xE6\xB0\xEE\xC4\x95\xA6\x7D\xC7\xDD\xC5\xF5\xC1\x01\xBB\xE1\xC7\x24\xC7\xB5\xC6\xC4\xC1\xB7\xC6\xEF\xC2\xB9\xC6\xF1\xC2\x78\xC7\xAC\xC5\x66\xC7\x51\xC1\x7D\xC4\x5C\xC6\x23\x7D\xFA\xBA\xD2\xAF\xE6\xBE\xFF\xC6\x7E\xC7\xB4\xC7\x77\xBA\xB6\xC7\x70\xC7\x5D\xC7\x41\xC4\x58\xC3\x60\xC7\x76\xC4\x9F\xBA\x78\xC4\x4E\xC1\x7A\xC4\x50\xC1\xC4\xC4\x50\xAA\x98\xC7\xB6\xC5\x71\x0F\xA4\x9A\x69\xC3\x02\x01\xC9\xC7\xBC\xC5\xA4\xC4\x7E\xC6\x0B\xC1\xB3\xC6\xEB\xC2\x25\xC7\xA6\xC5\x0A\xC8\xA8\xC5\x0C\xC8\xAA\xC5\x0E\xC8\xBC\xC6\x10\xC8\x3A\x90\x37\xC5\xF6\xBF\x77\xC1\x3A\xC5\x0E\xB0\x77\xC5\x11\xB0\xA1\xC3\x5E\xB2\xFB\x69\x30\xC8\x43\xC1\xBD\xC5\xB1\xC6\x04\xC6\x06\xC8\x9A\xC0\x72\xC7\xB6\xC6\x74\xC7\xB8\xC6\x76\xC7\x0D\xC8\x64\xC7\x79\xC7\x3F\xC8\xAE\xC5\xBD\xBC\x26\xB1\x6A\xBB\x3A\x0F\x51\xC5\x93\xC1\x53\xC5\x9F\xC3\x96\xC1\x48\xC8\x5A\xB8\x4A\xC8\xDE\xC7\x02\xC3\x1C\xC8\x82\xC7\xE3\xC5\xC9\xC2\xE1\xBF\xCB\xC2\xCB", "\xC3\xCD\xC2\x68\xC6\x2B\xC4\x46\xC6\x93\xC4\x8D\xC7\x2F\xC4\x9D\xC6\x31\xC4\x6B\xC5\x33\xC4\x93\xC7\x9B\xC4\x95\xC7\x00\xAB\x95\xC5\xC2\xC6\x51\xB1\xFB\x8E\x76\xC5\x35\xBD\x6B\xAE\xBB\xAA\x65\xC8\x21\xB6\x78\xC6\x68\xC8\xC4\xC3\x6A\xC8\xF4\xC7\x06\xC7\xF8\xC4\xF7\xC7\x0A\xC6\xF9\xC7\x0C\xC6\xFB\xC7\xC9\xC5\xFD\xC7\x6D\x9F\x80\xC8\x42\xC8\xBE\xB2\xE1\x8C\x73\xB0\x85\xC8\x7F\xC4\xE1\xAA\x83\xB9\x4B\xC8\x02\xC5\x04\xC8\x00\x83\xCE\xC4\x51\xC8\x1F\xC8\x5F\xC7\x43\xC4\x61\xC7\x23\xC8\x63\xC7\x25\xC8\x65\xC7\x27\xC8\x5B\xC8\x01\x93\x91\xA4\xBF\xB4\x9A\x95\xEC\xC1\xB5\xC5\x86\xC8\x5F\xB8\x06\x01\x0B\xAB\x01\x9B\x1C\xC7\x8B\xC8\x03\xC6\xF6\xC1\x23\xC7\xA7\xC8\x0E\xC5\x20\xC8\xAA\xC8\x22\xC8\x45\xC4\x4D\xC1\x47\xC4\x4F\xC1\x49\xC4\x11\xC8\x7C\xB3\xD3\xBB\xBC\xB0\xDB\xBB\xFE\x8E\x08\xC2\xF1\x9F\xB0\x9B\xD6\xC5\xE0\xB4\x3A\x76\xD9\xC5\x58\x90\x87\xC3\xE6\x65\x18\x8E\xF0\xC7\x0F\xBF\xF2\xC7\xE8\xC6\x35\xC8\x72\xC4\x08\xC8\x74\xC4\x54\xC8\x0B\xC8\x56\xC8\x3C\xC8\x58\xC8\x0F\xC8\xB4\xB8\xDA\xC2\xDD\xBE\xB7\xB8\xA5\xC6\x13\xC6\xE1\xBE\x9D\xB8\x94\xA7\xBB\x6D\xFC\xC5\xDA\xC5\x0A\x99\xDC\xC8\x19\xC8\x59\xC7\x6E\xC7\xE0\xC8\xB7\xC7\xA4\xC5\x37\xC8\x07\xC7\x27\xC7\xD5\xC6\xA9\xC5\xD7\xC6\xBB\xC6\xD9\xC6\x5F\xC3\xEC\xC8\x88\xB1\xC4\xA1\x58\xB2\xC6\xA1\xDE\xC2\xE5\xA0\xC7\x1C\x16\xBD\x97\xA7\x18\xC6\xF7\xC8\xBE\xC8\x4E\xC8\xC0\xC8\x50\xC8\xC2\xC1\xE3\xC8\x26\xC7\x39\xC8\x28\xC7\x03\xC9\x2A\xC7\xD8\xC6\x2C\xC7\xDA\xC6\xA6\x83\x4A\xAD\xF7\xC2\x34\xA1\x14\xC3\x52\xB5\x38\xA1\x54\xC7\xF8\xC8\x03\xC8\x44\xC1\xF3\xC7\xD1\xC6\x8F\xC8\x08\xC6\x91\xC8\xEE\xC6\x93\xC8\xF0\xC6\x95\xC8\x0E\xC6\x97\xC8\xEC\xC4\x10\xC3\x4B\xBF\xD0\x22\x13\xC3\x9E\xC8\x44\x7D\x58\xC6\x1B\xC7\xB9\x69\x2A\xC9\x00\xC6\xDE\xC5\xBA\xBB\x3D\xC6\x21\xC5\x3F\xC6\x60\xC1\x6D\xC8\x62\xC1\x6F\xC8\x22\xC6\xCC\xC3\x24\xC6\xCE\xC3\x6A\xC6\xD0\xC3\x9B\xC6\x60\xC4\x8F\xC7\x62\xC4\x9F\xC6\x64\xC4\xA1\xC6\x42\xC0\x49\xC3\x93\xB5\x08\x97\x0F\xB9\x42\xC9\x13\xC8\xA6\xC3\xA0\xC7\xDF\xC8\x03\xC7\xE1\xC8\xF6\xC4\x2F\xC9\xD3\xC6\x01\xC9\x09\xC7\x29\xC7\xC7\xC5\x35\xC9\xF2\xC6\x37\xC9\x30\xA1\x0D\xC2\xFA\x83\xA4\xC2\x43\x0F\xFC\xAD\x5F\xC9\x7A\xC6\x34\xC7\x62\xC9\x5A\xC5\xCD\xC7\x5C\xC5\x1E\xC6\xDD\xC0\x64\xC6\x58\xC4\x66\xC6\xE8\xC5\x89\xC7\xEA\xC5\x74\xC8\x9A\xC6\x67\xC5\x8C\xC5\x69\xC5\x8E\xC5\x7A\xC8\x90\xC5\x7C\xC8\xC3\x2E\xA3\xC6\x0A\xC9\x3E\xB9\x7F\x96\x7E\xBE\x11\x72\x46\xA8\x8D\xBA\x8D\x63\xAA\xC6\x57\xC5\x17\x8E\x14\xC9\xB5\xC7\x4F\xC8\x04\xC7\xC2\xC8\xB9\xC7\x24\xC3\xBB\xC7\x26\xC3\xBD\xC7\x28\xC3\xCA\xBF\x2A\xC3\x12\x95\x30\xC6\xF0\xB5\x7D\xC3\xE5\xA1\x49\xBD\x81\xC8\x97\xC5\xE2\xB2\x23\xC0\x0F\xBB\x92\x92\xBD\xBF\x41\xC9\x9B\xC9\x1B\xC8\x9D\xC9\x65\xC9\x06\xC6\x67\xC9\x3A\xC7\x69\xC9\x3C\xC7\x6B\xC9\x0B\xC7\x6D\xC9\x0D\xC7\x6F\xC9\x8B\xC6\x9B\xC3\xEE\x04\xD3\xBF\xDE\xC6\xA3\xB2\xA5\xB2\x51\xB4\x5C\x0A\x76\xC9\xAE\xC6\x61\xC9\x6E\xC3\x33\xC8\xC5\xC3\x8E\xC8\xFF\xC8\x90\xC8\xE5\xC7\xC5\xC5\xBF\xC9\x3E\xC7\xC1\xC9\x40\xC7\xC3\xC9\x3D\xB9\xCD\xC1\x3F\xAE\xB9\xA8\xBC\xB2\xAE\xC9\x14\xC7\xBA\xC3\x9B\xB9\x02\xC5\x9D\x77\x83\xB9\xCD\xC9\xCC\xC6\x44\xC9\x96\xC0\x02\xC7\x06\xC4\xA6\xC8\x18\xC9\x52\xC8\x09\xC8\xE5\xC8\x3A\xC8\xE7\xC8\x04\xC9\x3D\xC8\x06\xC9\x5A\xC8\xBE\xC6\x10\xC7\xA5\x43\x1E\xC0\xA5\xB4\x81\xC3\xE5\xC9\xB3\xC1\xE6\x84\x1A\xC7\x1C\x65\xEB\x85\x03\x01\xE9\xC9\xE4\xC6\xEB\xC9\xBE\xC1\xED\xC9\xA6\xC4\xC1\xC8\xF0\xC9\xA8\xC8\x73\xC7\x21\xC8\x75\xC7\xAC\xC8\x77\xC7\xE9\xC8\x3E\xC8\xB0\xC8\xD5\xB9\x05\xB3\x46\xC0\xDC\xC4\x06\xCA\xB6\xC9\xAD\xBA\xB8\xC9\xFD\xC8\xB4\xC6\xF1\xC9\xE4\xC8\x11\xCA\x55\xC8\x13\xCA\x57\xC8\xAE\xC8\x59\xC8\x17\xCA\x51\x85\x43\xC7\x5E\xC9\x1D\xCA\x00\xBB\xA5\xC8\x0D\xCA\x08\xC4\x82\xC5\x85\xC7\x3E\xBB\x87\xC7\x29\xC4\x72\xC8\x5C\xC4\x51\xC9\x5E\xC4\x53\xC9\x2E\xC5\x78\xC8\x6F\xC6\x57\xC9\xF2\xC5\x8D\xC9\x48\xC3\xA9\xC9\x03\x97\x38\xC4\x17\xC8\x9A\xC9\xDD\xC8\x1E\xC3\x0B\xCA\xCD\xC4\x31\xCA\xDC\xC0\xD1\x82\x7F\xC9\x26\xC5\x36\xCA\x62\xC5\x38\xCA\x45\xC6\x3A\xCA\x47\xC6\x3C\xCA\xEE\xC5\x55\xC9\xF0\xC5\x40\xCA\x71\xC6\x59\xC9\x2F\xC6\x7E\xC8\x8D\xC0\x01\xC5\xB3\xC1\x69\xC7\x4D\xC4\x23\xBA\x35\x0F\x2E\xCA\x17\xBB\x7C\xC9\xA4\xC7\x5A\xBF\xA6\xC7\x98\xC6\xAD\xC4\xA9", "\xC7\x88\xC6\xAB\xC7\x68\xB3\x20\x75\xA5\xC0\x13\xC9\x49\xCA\x6E\xC4\x4B\xCA\x22\xC7\x17\xC9\x32\xCA\x24\xC5\x50\xCA\x21\xC6\x35\xC0\x65\xC1\x44\xC6\x2A\xC5\x85\xC9\x8A\xC5\x87\xC9\x29\xC6\x89\xC9\x2B\xC6\x8B\xC9\x2D\xC6\x5E\xCA\x4F\xC6\x7C\xC4\xCD\xC8\xDD\xC5\xDE\x93\x81\xC4\x92\xA9\x07\xCA\x1E\xC7\xE5\xC6\xD0\xC9\x79\xCA\xE9\xC2\xB9\xC9\xE2\xC7\xBB\xC9\xE4\xC7\xBD\xC9\xE6\xC7\xD8\xC9\xE8\xC7\xDA\xC9\x50\xC7\xDC\xC9\x30\x9E\x71\xBA\x9F\xC4\x77\xC6\xFB\x69\x94\xCA\x33\xC7\xCF\xC9\x8C\xC3\xD1\xC9\x8D\xC8\x2E\xC9\xD4\xC9\x30\xC9\xD6\xC9\xF8\xC7\xA0\xCA\xFA\xC7\x1F\xC9\xFC\xC7\x21\xC9\xBA\xBA\x1D\x94\xC7\xC7\x03\xBA\xAA\xCA\x2A\xC8\xAC\xCA\x20\xC7\xAE\xCA\x1F\xCA\x1D\xC8\xB8\xC7\x7B\xBA\x42\xC6\x10\xA8\x82\xCA\x64\xC5\xEB\xC5\x11\xC4\x76\xC8\x95\xC4\x3E\xCA\x30\xC5\xC0\xC7\x58\xC9\xC2\xC7\x43\xCA\x60\xCA\xBB\xC0\x12\xC8\x77\xC9\x03\xC1\x3C\x0F\xCC\xB3\x1B\xCA\x02\x01\xBE\xCA\xDA\xC7\x7B\xC6\x7F\xC7\xC0\xBF\x7B\xC9\x1D\xC6\x6B\xCA\x7D\xC0\x97\xC6\x7D\xB6\x6F\xCA\xA5\xAF\x6E\xC6\xD0\xCA\xA7\xC9\xB6\x9D\x44\xCA\xFB\xC5\xED\xC7\x0E\x03\x0E\x93\xDE\xCA\xB2\xC7\x6C\xC4\xE1\xCA\xD9\xC0\xE3\xCA\x94\xC6\xCF\xC7\xAA\xC4\x6D\xCA\xE8\xCA\xA8\xC7\xEA\xCA\xAA\xC7\x88\xAE\xAC\xC7\xAE\x9E\xFF\xC7\x13\x90\x8C\xB7\x29\xC9\x68\xCA\x34\xBF\x80\xC5\x83\xC7\xB0\xB6\x34\xCA\x0A\xC0\x52\xCA\x28\xC5\x54\xCA\x83\xCA\x56\xCA\x75\xC8\x58\xCA\x49\xC6\x88\xCA\x4B\xC6\x8A\xCA\x4D\xC6\x8C\xCA\x73\xC6\x8E\xCA\x76\xB8\x4B\xC4\x1D\x90\x05\xC5\x76\xCA\xF9\xC8\x79\xC9\xA1\xC5\xFC\xC8\xC4\xCA\xFE\xC8\x19\xC9\x38\xC8\xF3\xC9\x1C\xC9\x3B\xC8\xF6\xC9\x15\xCA\xF8\xC9\x2A\xCA\x3C\xC1\xD9\xC7\xF5\xCA\x1D\xB8\x35\xB1\x88\xC8\xEA\xC1\xCC\x69\xF4\xCA\xCA\xC7\x52\xC3\xE2\xCA\x2D\xC9\x38\xC7\x9C\xCA\xF6\xC7\xB3\xCA\x92\xC8\xB5\xCA\x94\xC8\xB7\xCA\x96\xC8\xB9\xCA\x18\x87\x4D\xC5\x06\x98\x78\xC1\x55\xBB\x72\xC5\xC0\xAB\x34\xBB\xF6\xAF\xCC\xC9\x09\xCB\xEA\xC3\x61\xC6\x81\xC5\x7D\xCA\x0E\xCB\x8D\xC4\x70\xC8\x8F\xC4\x12\xCB\xCA\xCA\x84\xCA\xEC\xC5\x16\xCB\x8E\xC7\xCF\xCA\x90\xC7\x5C\xCA\x92\xC7\x1C\xCB\x94\xC7\xC4\xC7\x0F\x6D\x2C\xBB\x13\xC7\xF8\x9A\xF8\x9A\x40\x90\x4E\xCB\xB7\xC8\x9F\xC8\x8E\x10\x56\xC5\xA6\xB2\x67\xCA\x77\xCA\x09\xC5\x98\xCA\x20\xC3\x28\xCB\x21\xCA\x0F\xCA\x53\xC8\x24\xCA\xE6\xC8\x26\xCA\xE8\xC8\x28\xCA\xEA\xC8\xCB\xC8\x40\xC8\xCF\xC5\x4E\xC5\x14\xC2\xA0\xB0\x86\xB4\x6C\xA4\xFB\xC6\xB5\x8C\xE1\xC6\xDB\xC8\x54\xCB\x60\xC6\xCA\x9B\x4E\xCA\xD4\x85\x20\xC6\xEF\xC3\xE7\xC5\x0D\xC4\xE9\xC5\x0F\xC4\xCB\xCA\x66\xC5\xA8\xBF\x54\xC9\x63\xCB\x56\xC9\x1A\xCB\xC1\xC7\x03\xCB\x09\xB0\x87\xCB\xFE\xC9\x95\xA4\x9D\xC8\x56\xC6\x89\xB4\x48\x0F\x93\xBB\xAB\xC6\x76\xCB\x24\xCB\x97\xCA\xA1\xC7\xF9\xCA\xA3\xC7\x95\xC6\x6C\xCA\xD1\xC7\xA7\xC7\xD3\xC7\x87\xC6\xE9\xC7\x89\xC6\xEB\xC7\x2C\xBE\x99\xC8\xB8\xC3\xBB\xC1\xEB\xC1\xC4\x9F\xE6\xC9\xAD\x87\x9C\xB0\xB9\xC5\xB5\xC9\x77\xCB\x7D\xC6\x79\xCB\x70\xC4\x9A\xCA\x07\xC8\x22\xCA\x1A\xC9\x2C\xCB\x02\xC9\x2E\xCB\x1E\xC9\x05\xC9\x20\xC9\xBD\xC6\xE4\xAE\x62\xCA\x4F\xCB\x05\xC2\xD6\xC8\x07\xC2\x52\xB0\xD4\xC5\x46\x8D\xD5\xC8\xD1\xC5\xC3\xB0\xB4\xA0\x32\xBE\x06\x01\x92\x7D\x3C\xAC\x48\x0F\xDD\x6B\xBE\x70\x5D\x6E\x82\x73\xA2\xB4\xE6\x6B\x6B\x68\x6C\x67\xEB\x6B\x27\x01\xC0\xA1\xEF\xC8\x5A\x74\x8F\xCA\x43\xC9\x85\xBE\x59\x07\x6E\x74\x34\x90\x65\x0F\x2B\x84\x79\x74\x01\x0B\x29\xC8\xDF\xCA\x4B\x6C\x1A\x65\x05\x6C\x43\x0A\x9F\x9F\x0A\x6C\x4E\xBE\xD7\xCA\xCE\xC9\x76\x6C\x19\x85\x23\x6C\xE6\xC9\x18\x6C\x09\xCC\xF7\xCB\x60\xC9\x0C\xCC\x1A\x86\x0E\xCC\x01\xCA\x65\x0F\xA6\x8F\xFF\xCB\x19\xC5\x03\x6C\x98\xBE\xD4\x2E\x07\xCC\x27\x01\xE7\x84\x1A\xCC\xD9\xCB\x71\xCB\x14\x01\xC4\x7D\x09\xA0\x34\x74\x4F\xCB\x35\x6C\x06\x01\xDF\xBB\xBD\x8F\x38\x6C\x01\xCC\x35\xCB\xF5\x6B\x19\xA7\xBB\x7D\x3C\xC5\x65\x0F\x06\xB3\x22\xCC\x34\xCB\x99\x9F\x2D\xBE\xA0\x06\x3D\xC9\x54\x74\x3B\x66\x11\xCC\x1F\xCB\xDD\xC5\x3A\xCC\xAD\x0E\x90\xBB\x1D\x6D\x65\x0F\x5E\x7D\xAF\xBE\x09\xA0\x0A\xCC\xEA\xC9\x42\xCC\xD3\x0C\x62\xC8\x6D\x95\x2D\x96\x16\x65\xC9\xBE\xB6\xC2\xCC\x69\x38\x8E\x33\xB0\x0C\xAF\x2C\xC9\x27\xCB\x6B\xC8\x40\xC6\x4A\xC9\x5F\xC5\x63\xC1\x80\xCA\x23\xC6\x66\xC1\x25\xC6\x68\xC1\x27\xC6\x86\xCA\x6D\xC6\x01\xCB\xE2\xAE\xB5\xC2\xA5\xC2\xDC\xBE\x09\xC9\xCC\xB5\x0B\xC9\x43\xA8\xE2", "\x9B\x0E\xC9\x66\xC3\x14\xB5\x73\xC9\xE2\x76\xA9\x67\x55\xCC\x54\xB0\x61\xAF\xA4\xC8\x40\x7B\xF0\xB3\x1E\xC8\xC3\xC8\xA9\xC8\x10\xC5\xAB\xC8\xC7\xC8\x24\xC8\xC9\xC8\x26\xC8\x16\x83\x08\xC9\x00\xBF\x11\xC6\x31\xBD\xF8\xC5\x14\xC6\x05\xBF\x16\xC6\x29\xA6\xE2\xC2\x54\xC7\x77\xCC\xE9\xAC\x92\xAD\x97\xAF\x4D\xC8\x9C\xC9\x16\xC9\x9E\xC9\x0E\xCA\x7E\xCC\x10\xCA\xC5\xC8\x12\xCA\x82\xCC\xAD\xC8\x84\xCC\xAF\xC8\x85\xCB\xDB\xC6\x27\xBF\x24\xC9\xF7\xBB\x35\xC6\xC6\xC6\x3E\xB6\x38\xC6\x01\x01\x5D\x86\x63\xB9\x71\x6D\x92\xCC\x07\xAD\xE2\xCB\xD7\xAF\xFA\xC8\xDF\xC7\x34\xC8\x20\xCA\x36\xC8\x2A\xCB\x00\xC9\x1B\xC9\xD2\xCB\xF5\xC9\xD4\xCB\xF7\xC9\xD6\xCB\xF9\xC9\x28\xC1\xEE\xB8\x15\x6E\x5A\xA1\x26\xC9\x3F\xC9\x04\xCA\x76\xCC\x7B\xB0\x34\xB0\xCB\xC7\x1C\xC1\xB3\xCB\x22\xC5\xE5\xCA\x60\xC5\xE7\xCA\x7E\xBB\x99\xC6\x85\xCA\x9E\xCB\x3D\xCA\x18\xCB\x9E\xC6\xA2\xCB\xD2\xCA\xA4\xCB\x86\x94\x5C\xC9\x9B\x80\x0E\x93\xB0\xCC\x55\xAD\xDC\xCB\xCD\xAE\x1A\xC8\x1E\xCA\x98\xCC\xCD\xCB\x9F\xC9\xC6\xCA\xBA\xC7\x43\xC6\xA6\xBF\xC9\xA2\xD6\xCC\x59\xCA\xA0\xCB\x5B\xCA\xDA\xCC\x41\xCA\x67\xCB\x7D\xC8\x69\xCB\x9E\xB2\x71\xC9\x71\x0F\x8E\xC6\x47\xCA\x03\x01\xE1\xCC\x7A\xAD\xE3\xCC\xEF\xAE\xE5\xCC\x2F\xCA\x7B\xCC\xCA\xB9\x7C\xCA\x63\xC6\x59\xCB\x84\xC5\x5B\xCB\x86\xC5\x5D\xCB\x88\xC5\x5F\xCB\xCC\xCA\x61\xCB\x77\xC8\xD8\xCC\x79\xC8\xD1\xCA\xF4\xCC\xD3\xCA\xF4\xCB\xAE\xCC\xB7\xC2\xDB\xC2\x76\xB2\x91\xBE\x6C\xBE\x64\xC3\xA8\xC6\x71\x0F\x98\xC9\x75\xCB\x09\x01\xFE\xCC\xB3\xAD\xB2\xCC\xE4\xCC\xB4\xCC\x69\xC8\xC3\xCA\x5A\xCC\x49\xC9\x84\xC7\x6E\xC8\x86\xC7\x0A\xCD\x88\xC7\x0C\xCD\x8A\xC7\x9C\xCB\x8C\xC7\x10\xCD\xCE\xCA\x12\xCD\x3F\xCA\xF3\xCC\x5D\xCA\x16\xCD\xF0\xAD\x5B\xB9\xC0\xC6\xAD\xC9\x9A\xC8\xC3\xC6\xB0\xC9\x16\xC7\xA9\xCC\x81\xB9\xFB\xB5\x8F\xC6\x06\x01\x24\xCD\xD6\xAD\x00\xAE\x57\xCC\x96\xCC\xB7\xC9\xE7\xCC\xB7\xCC\xE2\xC8\xCF\xCB\x2B\xCB\x7F\xCB\xF4\xC9\x81\xCB\x2F\xCB\x83\xCB\x16\xCA\xA3\xCC\x22\xC9\xDC\xC6\xC7\xC9\x17\xC7\xDF\xC6\xCA\xC9\x35\xBB\x54\xCC\xCA\xCC\x4D\xCD\x32\xC8\xCB\xCB\xB8\xC4\x7B\xCB\xB8\xCC\x53\xCD\xBA\xCC\xD1\xCB\x6A\xC9\x1D\xC9\x6C\xC9\x47\xCB\x36\xC9\x49\xCB\x5A\xB9\xDE\xC9\x78\xB2\xB7\xC3\xB1\xC5\x8D\xBB\x15\xC7\xBB\xC3\x5F\xCD\xA3\xB2\xFD\xBF\xAE\xCB\x23\xCD\x64\xCD\xA2\xB0\x4E\xCD\xE6\xCC\x05\xC8\x99\xCC\x06\xCD\x7E\xC9\x08\xCD\x65\xC6\x10\xCB\x67\xC6\x4F\xC9\x69\xC6\x63\xCC\x6B\xC6\x65\xCC\x9C\xC6\x38\xCD\xEC\xCA\x15\xC5\xA8\xC9\xD5\xCA\x1B\xCD\x52\xA2\xBB\xB9\xF8\xC6\x5E\xB9\x3C\xCC\x02\xCA\xE6\xC3\x0F\xB9\x4A\xCD\xFF\xAD\x94\xCC\x16\xB0\xCC\xCC\x7F\xC1\xEE\xC9\x4D\xCA\x62\xC6\x88\xCD\x2E\xCD\x35\xCA\x30\xCD\x37\xCA\x8D\xCD\x73\xC8\x14\xCB\x86\xC9\xEF\xCC\x17\xCB\xEB\xCA\x64\xCB\x3A\xCD\x66\xCB\x3C\xCD\x17\xB2\x19\xCA\x30\xC7\xA0\xCD\x81\xCD\x56\xB0\x83\xCD\x03\xCD\x21\x92\x51\xCD\x66\xC9\xB1\xCA\x68\xC9\xBB\xCC\x6E\xCD\xD3\xCB\x70\xCD\xD5\xCB\xB8\xCA\xD7\xCB\x5A\xC0\x1C\xC4\xCA\x8F\x40\xC9\x42\x6A\xA1\xCD\x85\xB4\x7A\xB8\x82\xCD\x66\xCD\xB2\xCB\x3F\xCB\x48\xC7\xF5\xC7\x4A\xC7\x31\xC9\x4C\xC7\x33\xC9\x4E\xC7\xA2\xCA\xD6\xC7\xA4\xCA\x3E\xB7\x46\xCA\x2C\xC1\xD3\xCD\x74\xC5\x26\xCD\x01\xCD\x28\xCD\x8C\xC8\x2A\xCD\xD3\xC9\xB9\xCC\xD5\xC9\x9E\xCA\xD7\xC9\x6F\xCD\xC0\xC9\x71\xCD\x6E\xC9\x73\xCD\x89\x8F\x38\xCC\x3E\xC1\xD6\xA2\x65\xCA\x6B\xC7\x80\xCD\x56\xCC\xD6\xCD\xA5\xCD\xF3\xC4\x59\xCC\xEE\xCD\x6B\xCD\xF0\xCD\xC7\xCD\xBE\xC9\xF3\xCD\xD9\xC9\xF5\xCD\xC2\xC9\xA3\xC0\x74\xCA\x68\xC4\x0A\x99\xE7\xCD\x4B\xB0\x00\xCD\xFE\x86\xF7\xCA\xCC\xC7\xD9\xCD\xCE\xC7\x49\xC7\xD0\xC7\xDD\xCD\xD2\xC7\xDF\xCD\xD4\xC7\xE1\xCD\xEA\xC7\xE3\xCD\xE7\x9F\x1B\xCC\xFB\xBF\x71\x0F\x55\xBA\xDC\xCA\x01\x01\x11\xCE\xCB\xAE\xD7\xC5\xEA\xCD\x25\xCB\xCF\xC6\x17\xCE\x6A\xCA\xB5\xCB\xE6\xCA\xFD\xCA\xD3\xCC\xE9\xCA\xA3\xB1\x67\xCC\x59\xAF\xDC\xCC\xB4\xB3\xAE\xC7\xE6\x80\x92\xA9\x29\xCE\x6B\xBB\x13\xCE\x59\x87\x15\xCE\xCD\xCC\x2F\xCE\xE4\xCA\x31\xCE\xD1\xCC\x33\xCE\xF3\xBE\x35\xCE\x49\xB3\x37\xCE\xB0\xB3\xB9\xCD\xE7\xB3\xB3\xC4\xB6\xB3\x10\xCE\xBE\xCD\x24\xAF\x02\xCD\x69\xCA\x45\xCE\xFB\xCA\xA5\xC7\xB7\xCB\x6E\xCA\xFF\xCA\x36\xCE\x71\xCA\x02\xCB\x8A\xC6\xCC\xAF\xF9\xCD\x95\xB0\xDC\xC7\x27\xCE\x00\x00\x3E\xCE\x8A\xCB\xD5\xCD\xBF\xCD\xD7\xCD\x63\xC9\xA7\xCD\x7B\xCA\x94\xCB\xC6", "\x88\xEE\xC3\xC1\xBB\x4D\xC9\x71\xC8\xAF\xCD\x39\xCA\x8F\xCD\x52\xC9\x91\xCD\x9F\xCB\x93\xCD\xB6\xCD\x14\xCD\x3B\xCD\x39\xCE\x1F\xCD\xFF\x00\x00\xAA\xBD\xCD\xFF\xCD\x6A\xCE\x01\xCE\x46\xC9\xA2\xC7\xCF\xCC\x46\xCE\x5E\xCC\x61\xC5\x11\xCB\x75\xCE\x55\xCA\x77\xCE\x3B\xCA\x79\xCE\xD7\xCC\xB5\xCD\xA1\xCB\x7D\xCE\xB8\xCD\x7F\xCE\x8E\xCC\xB4\x9B\x01\xB4\xD9\xBA\xC4\xB6\x67\xCE\x82\xC8\x4D\xAE\x7C\xB0\x86\xCE\x21\xC7\x99\xCA\xC3\xCD\xBA\xC9\xC5\xCD\xBC\xC9\x07\xCE\x9F\xCA\x09\xCE\xA1\xCA\x0B\xCE\xDB\xC9\xF7\xCD\x50\xBA\x62\xCE\x02\xC5\xD3\xA3\x22\xCB\x9D\xCE\x53\xCE\xB3\xCC\x2D\xCE\x36\xC7\x44\xCE\xFA\xCA\x19\xCE\xFC\xCA\x5A\xCE\xFE\xCA\xB9\xCB\x70\xCA\xBB\xCB\x72\xCA\xBD\xCB\x99\x8F\xA4\xB7\xA3\xB2\x2D\xC8\x7F\xCD\x49\xCD\xB6\xCE\x27\xCD\xB8\xCE\x5A\xC7\x03\xCE\xB0\xCA\xEF\xCD\xB2\xCA\xF1\xCD\xB4\xCA\xAB\xCE\xB6\xCA\xCB\xCD\x48\xCB\xCD\xCD\xE7\xC1\x4B\xCB\x34\xB8\x4D\xCB\x8D\xCB\xD1\x9A\x38\xCB\x98\xC1\xFB\x69\x9E\xCE\x61\xB1\xA0\xCE\xCB\xCC\x3D\xCB\xF8\xCA\xBA\xCE\xB4\xCB\x58\xCE\xB6\xCB\x1B\xCE\xB8\xCB\x1D\xCE\xBA\xCB\x1F\xCE\xBC\xCB\x21\xCE\x99\x8F\x6B\xCB\xE2\xC9\x6D\xCB\x8F\xAA\x6F\xCB\xDE\xCE\x95\xAA\x8F\xCB\xB9\x69\xE3\xCE\xB5\xC1\xA3\xCD\xA1\xCE\xE7\xCE\x16\xCE\xCF\xCE\x40\xCB\xA7\xCE\x9D\xCA\xA9\xCE\xF2\xCD\xC9\xCD\xF4\xCD\xD7\xCE\x72\xCD\xD9\xCE\x18\xBE\xBF\xCB\x78\xCD\xE8\xCD\x29\x96\x87\xB4\xAA\xCB\x4E\xB4\x8E\x10\x4A\x95\x22\xCD\xCA\xCE\x84\xCE\x54\xCE\xEB\xCD\xBF\xC8\x85\xCD\xE8\xCC\x9A\xCC\xA0\xC9\x0F\xC5\xA2\xC9\x11\xC5\xA4\xC9\x13\xC5\xA6\xC9\x95\xCD\xEE\xCA\x97\xCD\x6A\xCB\x10\xCF\x51\x8D\x79\xCD\x2B\x03\xA9\xCB\x44\xCC\x32\xBB\xFF\x00\xAD\xCB\x99\xC9\xFD\xCC\xCB\xCE\x2C\xCE\xB1\xCB\x6C\xCE\x0C\xCA\x6E\xCE\xA9\xCD\x4F\xCA\x89\xCD\x80\xC9\x8B\xCD\x82\xC9\x32\xCD\x84\xC9\xB1\xCD\xD5\xCC\xBE\xC7\x90\xA2\x96\xCE\xC9\xAF\xAB\xAD\xF7\xCC\x4E\xBB\x8B\xBB\xB2\xCE\x79\xBE\xC3\x9F\xB4\xC5\x88\xCB\x72\xCB\x71\x0F\xB8\xC5\xBC\xC8\xFD\xCE\x38\xCF\x14\xCE\x55\xCE\x0A\xCB\x56\xCB\x0C\xCB\x08\xC0\x40\xCF\x51\xCA\xAD\xCD\x53\xCA\x8E\xCE\x13\xCB\x90\xCE\x57\xCA\x92\xCE\xF0\xCC\x7B\xCE\x95\xCE\xED\xCA\x0D\x9E\x2B\xCF\xA3\xB7\x23\xCE\x5B\x7B\xCF\xC8\x2B\xCE\xD6\xBB\xDE\xCB\xEB\x09\x0A\xC2\x4D\x9C\x0C\xC2\x14\x8E\xCF\xB0\xD4\x00\x38\xB1\x59\xC2\x5D\xC8\xE4\xCE\x0B\xAF\x00\xCA\x14\x8F\xCF\xB0\xBB\xC8\x2D\xCC\x20\xBD\x3B\xC2\xFA\x87\xEC\x9F\x69\xCE\xE3\xCB\x31\xB1\x7C\xA3\x7A\x3F\x1E\x02\xE7\xA4\x40\xCE\xD1\xC8\x8F\x79\x52\xCC\x8B\xBD\xCC\x69\x17\xBE\xFE\xC7\x80\xBF\xFA\xAC\xED\xC8\x65\xAE\x6E\xCC\xC6\x7D\x70\xCC\x9E\xB8\xF0\xCA\x44\x0F\xE5\xBE\xAD\x90\x5C\x0A\x99\xCF\xFC\x9C\x53\xCC\x9C\xCF\x6C\xCC\x41\xA8\x1C\xCD\x6E\x91\x8C\xCC\xB0\xB1\x92\xA8\x96\xA7\x71\x0F\x90\xCC\x06\xBD\xA7\xCF\x48\x90\x5C\xCD\xA5\xCC\x3F\x8F\xA2\x90\x2A\xBF\xAB\xCC\x00\x00\xAD\xCC\xA3\xAB\x71\x6D\xA8\xCF\x0F\x9E\x43\xC0\x66\xAB\x21\x0C\x54\xC6\xF4\xB1\x9E\xC3\x4D\x6E\xC7\xCC\xF0\xBB\xA6\x40\xB8\xCF\x28\xC1\x76\xC6\xFC\x99\x98\xCF\xCF\xCF\x23\xB9\xF6\x9F\x7E\xBF\xB1\xB5\xA6\xCF\xF6\x46\x1A\x8F\x74\xC9\x46\x83\x88\xCC\xA4\xC6\x12\xC6\x44\x88\x95\xBF\x70\xBA\x97\xC9\x66\x90\xCF\x6F\x25\x38\xD4\xCF\x74\xCD\xAF\xC5\x5C\xB9\x9B\xCD\xBD\xB9\xFA\xCE\x8D\x63\x47\xCD\x41\xBC\xDA\xCF\xCC\xC8\xEF\xCA\x0C\xA2\x86\xBD\xAC\x97\x5E\xCD\x45\xCD\x7B\xC1\xE0\xC6\xE0\xCE\x44\xBD\xB7\xCF\x69\x90\xB9\xB2\xAB\xC9\xBB\xB2\xF7\xC6\x6C\xCB\x8D\x92\xF8\xBF\x7B\xCD\xF9\xCF\x84\xC3\x48\xAE\xBA\xC1\xC6\xBC\xFE\xCF\xF3\xCF\x6F\xCF\xAF\x6D\xBA\xB9\xDD\xC3\x50\x9D\x41\xCD\xE1\xB2\xB0\x0F\xC5\xC6\xB2\xC9\x5A\xA2\x03\xCA\xCD\xCF\xC3\xCF\x00\xC5\x7C\xB9\x8C\xAE\x30\x93\xBB\x99\x1C\xD0\x00\xC1\x49\xC3\xA5\xB6\xA7\xAE\x10\xC2\xC2\xCF\xE8\xCF\x09\x85\x36\xB3\x0E\x9A\x22\xD0\x61\xCE\x43\xC0\xC6\xCE\x9C\x98\x21\xBA\xFC\xCD\x90\xC2\xFB\x69\x2D\xD0\xA5\xCA\x17\xBD\x1B\xA6\xAE\xA6\x36\xD0\x95\x9A\x38\xAA\x71\xCF\xDF\xC6\x26\xCE\xCB\x8F\x28\xD0\xFF\xCF\x35\xB3\x3B\xCE\x89\x02\xE0\x99\x3B\xD0\x22\xCE\x4F\xCE\xBB\xCA\xB4\xC4\x3A\xD0\x29\xD0\xB0\xCE\x4A\xCC\x08\xCA\x89\x8B\x05\xC1\x27\xD0\x35\xD0\x4E\xD0\xD9\xC4\xB8\x79\xDB\xC4\x41\xD0\x55\xD0\x43\xD0\xA4\xCC\x3F\xBD\x06\xCB\x9C\xCE\x61\xC2\x48\xD0\xC5\xCE\x3D\xD0\x23\xCC\x54\xCF\x53\x9B\x15\xC8\x2C\xD0\x56\xD0\xC4\xCF\x12\xCC\xD8\xCA\x55\xCF\x1B\xC5\xFC", "\xCF\xE6\xCF\xCE\xCF\x5C\xD0\x21\xBE\xDB\xCE\xF8\xC6\xDD\xCE\x46\xC8\x24\x9F\xE5\xCF\xA9\x67\x62\xD0\x18\xC5\x21\xB3\xF5\xCE\x14\xD0\xF1\x0E\x6E\xCB\x67\xB4\x78\xD0\x64\xC8\x0B\xD0\xFD\xBC\x5B\xD0\x0E\xD0\x4D\xCF\x70\xC5\x4F\xCF\x63\xCA\x4B\xCD\x83\xC8\x14\xCF\x32\xCF\x1C\xAE\x17\xCF\x7A\xD0\xE6\x65\x7C\xD0\xDD\xA4\x2B\xBB\x2D\xCF\x34\x8E\x2F\x9B\x30\xCF\x37\xB8\x9D\xCD\x75\x95\x70\xD0\x7B\xD0\x6A\xD0\x50\x9B\x99\xD0\x35\xB2\x57\xC1\xC2\xCB\x53\xCF\x1A\xC5\x57\xCF\x87\x7B\x76\x36\xA2\xD0\x23\xD0\x40\xCC\xF8\xCB\x73\xCF\x93\xCF\x28\xAB\x76\xCF\xA1\x09\xD4\xC8\x0B\xC2\xD0\xC8\xB3\xD0\x7D\xBF\x8E\x10\x3C\x06\xD5\x00\xC7\xBE\x9A\xCE\x9B\x10\xB5\xA5\x01\x01\xAE\xBE\x5A\xD0\xCC\x69\xD0\x95\x45\xC9\xF4\x5A\x18\x0D\x5C\x0A\xB5\xBE\xC2\x82\x29\x03\x4D\x6F\xB9\xBE\xA2\xA5\xBB\xBE\xBB\x99\xC6\xD0\xB5\xB5\x8F\x25\xAD\xA0\xC1\xBE\x62\x6F\x5E\xD0\x8D\x63\xD7\x96\xC8\xB0\x5C\x0A\xDE\x95\xB0\xA6\x7F\x60\xED\xB0\x84\xCF\x16\x65\xC1\xD0\x00\x00\xC3\xD0\xD2\xCF\x5C\x0A\xDA\x95\x7D\xA6\x8B\x9B\x97\x0B\xCA\xD0\xB6\xBE\xD5\x6E\xB7\x6E\x00\xB1\xD0\xD0\xE0\x99\xE9\xD0\x8E\xA6\xE6\x99\xD6\x01\xD6\xD0\xEF\xD0\x04\x6F\xEA\x95\x16\x65\x64\x08\x22\x73\xBE\xD0\x37\xAC\x3C\x0F\xE4\xD0\xE6\xD0\x87\xCF\x71\x6D\xE4\x95\xB2\xBE\x11\x3B\xE3\x09\xED\xD0\xCC\xD0\x65\x6F\xF0\xD0\xAE\x6F\xBA\xBE\xE0\x99\x06\xD1\xBE\xBE\xB3\xBE\x07\x8F\xC0\xBE\xF9\xD0\x1A\x6F\xFB\xD0\x3C\x0F\x64\x08\x4A\x58\x06\x97\x9B\x10\xDB\xD0\xC7\xAC\xEF\x95\x35\x65\xF4\xB0\xF8\xA6\x31\xBE\x01\xD1\xAD\xBE\xE0\x99\x09\x6F\x20\x65\x22\xD1\x0A\xD1\xF1\xC1\x4C\x6F\xA1\x6E\xF1\xD0\xBC\xB7\xD1\xD0\x54\xD0\xCC\x69\x28\xD1\x2B\xA7\x34\x61\x78\x08\xF8\xD0\xF4\x6E\xEC\x6E\xEA\xB0\x55\xBE\x06\x01\xCD\x17\x6C\x68\x00\xBE\x09\x01\xD2\x20\x34\xA7\x48\xB1\x25\x6B\x2F\x09\x44\xD1\xFA\xA5\x15\xA6\xB6\x5C\x73\xBE\xD4\xCD\x52\xB1\xF8\x5C\xAC\x66\xD9\x00\xBE\x70\x4F\x00\xAB\x72\x02\x70\x52\xD1\x85\xA6\x26\xA6\x32\xA6\x1F\xA7\xAE\x5C\x80\x0A\x4B\xD1\x13\x67\x81\x26\x82\x04\x70\x0F\x42\xD1\x11\xBD\x00\x00\x5A\xB1\x58\x73\x02\x01\x64\xD1\xB9\xA6\x57\xD1\xB5\xA6\xF0\xA6\x89\xA6\x5B\xD1\x6B\x68\x93\xA6\x76\x0B\x4F\xD1\xBE\x70\x39\x61\xD5\x73\x2F\x09\x73\xD1\x35\xA6\xE4\x7B\x4A\xD1\x6B\x68\xDB\x64\x2B\x73\xD1\x20\xBE\x70\x55\xB1\x65\xD1\x01\x01\x7F\xD1\x68\xD1\x74\xA6\x58\xD1\x6B\xD1\xFB\x7B\x6D\xD1\x6A\x68\x6F\xD1\x18\x64\x54\xBE\xE5\xCB\x03\x01\x34\x2B\x95\xA5\x31\xB2\xB3\x06\xA7\x06\xED\x63\xB2\x9A\x8F\x99\x44\x10\x70\x0F\xE4\x00\xBE\x70\xB8\x97\x85\xBC\x91\xD1\x90\x01\x4A\x5F\xB8\xBE\x5F\x9A\xF5\x1C\x2F\x09\x9B\xD1\x37\x9A\x5C\xD1\xD2\xA6\x35\x9B\x49\x02\x70\x0F\xE6\x00\xBE\x70\xDA\x00\xB4\x6E\x79\x9D\x92\xD1\xB2\x99\x4F\x68\x95\xD1\xA2\xD1\xD1\x20\xDD\xA3\x69\x24\x73\x66\x8A\x0D\xA0\xD1\xCB\xB0\xEB\xD0\xA9\xD1\x27\x01\xDF\x00\xBE\x70\xD7\x00\x64\xBE\x36\x81\xB0\xD1\xDD\x63\xB3\xD1\xB4\x06\x2F\x09\xC1\xD1\xBD\x99\xB8\xD1\xE2\x0D\xE4\x63\x15\xD0\x57\x5A\xC2\xBE\x51\xCF\xAF\x9B\x81\x55\x05\x58\x42\xCD\x55\xB0\x12\x03\x70\x0F\xDD\x00\xBE\x70\xD5\x00\xAE\xD1\x8E\xAE\xC4\xD1\x94\xD1\x98\x9E\x69\x24\x2F\x09\xDB\xD1\xCA\xD1\x32\xCC\x4E\x34\xEE\x3E\x4F\xBC\xA3\x95\x17\x03\xAC\x66\xDB\x00\xBE\x70\xD4\x00\xDC\xD1\x64\xBF\xDE\xD1\xCD\xD1\xC6\xD1\x86\x01\x2F\x09\xEE\xD1\xE4\xD1\x33\x9C\x7C\x1D\xDF\x25\x3C\xC6\xB7\x4C\x49\x4E\xAC\x66\xE3\x00\xBE\x70\x8A\x00\xEF\xD1\xA8\xCA\xBA\x6A\xDB\x3E\xF2\xD1\xE0\xD1\xB4\xD1\xF4\x87\xB6\xD1\xF5\x1C\xCB\xD1\x28\x0D\xFA\xD1\xB4\xD0\xB3\x5A\x81\x46\xE3\x04\x70\x0F\xE7\x00\xBE\x70\x77\x00\x02\xD2\xD1\xCD\x1E\x5C\x05\xD2\xB3\x99\xF3\xD1\x6B\x00\x2F\x09\x16\xD2\xF7\xD1\x2E\xBC\x72\x4E\xBA\xD1\x5E\x0E\xE6\x99\xBD\xD1\x09\x01\xE0\x00\xBE\x70\xB4\x43\x8F\xC2\x9D\xD1\x51\x01\x9F\xD1\xD0\xD1\x1C\xD2\x2F\x09\x2A\xD2\x87\x9B\x86\x01\x73\x66\x1B\x11\x02\x58\xD5\xD1\xCF\xD1\x98\x73\x09\x01\xAB\xD1\x1C\x75\xC9\x32\xA6\xD1\xB4\xBC\xF1\xD1\x1B\xD2\x07\xD2\xC7\xD1\x27\x01\xC9\x32\xE5\x96\x0B\xD2\xD1\xD1\x5B\x49\x06\xD2\x68\x10\x25\xD2\x13\x73\xA2\x1D\xBE\x70\x1C\x00\x17\xD2\xC8\xCC\x2B\x12\x1A\xD2\xB2\xD1\x43\xD2\xF4\xD1\x27\x01\x51\xD2\x20\xD2\x3C\xC4\x70\x0A\x3D\x55\xE8\xD1\x11\x72\xC1\x72\x70\x0F\x86\xCF\x80\x67\x15\x00\xC2\xD1\xAF\xD1\x9E\xD1\xB4\x06\xC5\xD1\x57\xD2\x1D\xD2\x72\x02\x0A\xD2\xB4\x06\x0C", "\xD2\xF9\xD1\xDF\xD1\xE2\xA4\x4C\xCD\x83\xCF\x3F\x0F\x71\x7B\xF2\x3A\xBE\x0B\x92\xCF\xE9\xCD\x7D\x67\x64\x6C\xBE\x70\x09\x48\x71\xA5\x18\xD2\x3B\x8E\x2E\xD2\xD8\xD0\x6B\xD2\x2F\x09\x7F\xD2\x33\x96\x48\xD2\xF8\xD1\x46\x2A\x0E\xD2\xE1\xA6\xE6\x7C\xBC\x9B\xAF\x26\xAC\x66\xBD\x54\x8A\xC2\x00\x00\x5C\x9A\x78\xBE\xC5\xC9\x55\xD2\x23\xD2\x77\x9E\xE1\xD1\x27\x01\x95\xD2\x37\x9A\x70\xD2\x8B\xD2\x72\xD2\x4E\x63\xFA\x6E\xAF\x5F\x03\xA0\x5C\x35\xEB\x07\x6A\xD2\xFB\x87\xFD\xA6\xAF\x5F\xAC\x66\xE5\x00\xBE\x70\x06\x9A\x9C\xD1\x9F\xB2\x51\x9C\x83\xD2\xFD\x7C\x5D\x96\x2F\x09\xAF\xD2\x9E\xD2\x8E\xD0\xCE\x02\x6A\x4E\xA8\xD2\x4E\x34\x4D\xD2\x3A\xD2\x2B\x6C\xBE\x70\xF0\x95\xB0\xD2\x97\xD2\xB3\xD2\x1C\x9A\x08\xD2\x06\x01\xC2\xD2\xB8\xD2\x8A\xD2\x0B\x47\x8C\xD2\xFC\xA6\x8E\xD2\x47\x3B\x06\xA6\x70\x0F\xE8\x00\xBE\x70\xDE\xD0\x2B\xD2\xB1\xD2\x98\xD2\x2F\xD2\x85\xD2\x27\x01\xD5\xD2\x33\xD2\xB8\x72\xCB\xD2\xC1\x59\xCD\xD2\x4C\xD2\xEB\xD0\xD6\x01\xAC\x66\xA7\x41\x34\xA7\x34\x2A\x3F\xD2\x24\xBC\x04\xD2\xC5\xD2\xA1\xD1\x44\xD2\x09\x01\x3A\xA6\x11\x98\x89\xD2\x56\x9C\x0D\xD2\xA1\xD2\x4C\xC0\xBE\x3E\xAC\x66\xE2\x00\xBE\x70\x25\x7C\xE9\xD2\x21\x0F\xD8\xD2\x84\xD2\x9A\xD2\xC7\xD2\xE5\x52\x31\x9B\x6F\xD2\xA5\xBE\x08\x61\xE1\xD2\x96\xBA\x2A\x45\xAC\x66\x63\xD2\xAA\x71\xCE\x99\x65\xBE\x40\xD2\x68\xD2\x93\xD1\x4B\xD2\xC0\xA7\x9B\xD2\x60\xD0\x5E\x9B\xF2\xD2\x75\x9C\xCC\xD1\x42\xD2\x73\xD2\x00\xCF\x2E\xAB\xD2\xB8\xDA\x03\xBF\x24\xF3\x3A\xC1\xB0\xB2\xD0\x72\x01\x70\x0F\x7E\x6F\x80\x67\xA9\x5C\xFC\xD2\xED\x04\xFE\xD2\xB4\xD2\xB9\x96\x6C\xD2\xF6\x40\x03\xD3\x34\xD2\x05\xD3\xC6\x01\x07\xD3\x1C\x96\x08\x96\xA0\x6F\xFF\xD0\x59\x8E\x64\x08\xEB\x00\x38\xD3\x7B\xCF\xA2\xA5\xBA\x99\x32\xD1\xD5\x87\xF5\x33\xC4\x99\xBC\xD1\xD9\xD2\xF4\xB6\xE0\x3D\x1A\xD3\xBD\xD2\x44\xD3\xFF\xD2\xC3\xBE\x44\x0F\x3C\x06\x3C\xD2\x9F\xBE\xD8\xC8\x94\x92\xC9\x99\xEA\xD0\x5E\x97\x37\x97\x6B\xCE\x7A\xC9\xE9\xCE\x89\xCE\xEB\xCE\x32\xCE\xBE\xCE\x34\xCE\x5C\xCE\x4B\xCE\x5E\xCE\x68\xCC\x0F\xC6\x87\xCC\xDD\xA0\x9E\xCF\x91\xC9\xE0\xBE\x81\x96\x52\x0C\xF2\xC8\x80\xCE\xA5\xCF\xA2\xB8\x06\x01\x53\xD3\xF5\xD0\x4A\xD3\x15\x98\x1D\xCF\x15\xC9\x1F\xCF\xA5\xCE\x9B\xCA\x06\xCF\x42\xCB\xD3\xCE\x44\xCB\xD5\xCE\x46\xCB\x0C\xCF\xF6\xCD\x07\xC9\x9B\xCF\x2C\x8F\x1A\xCD\x78\x8F\xAE\xCF\x0D\xC9\xA2\xCF\xF5\xCF\xE7\x87\x08\xBF\xB4\xB1\x0A\x99\x70\xD3\x9F\xA6\xBE\xD2\x73\xD3\xCD\xCE\xFB\xC8\x64\xC9\x77\xD3\xCE\xCB\x7D\xCB\xF2\xC9\x55\xCD\x2D\xCB\xBD\xCC\xCA\xCD\xBF\xCC\xCC\xCD\xC1\xCC\xD5\xCF\xBA\xCF\x32\xA1\x14\x05\xF8\xC2\x3C\xCC\x8F\x79\x4E\xD3\xF5\x95\x6A\xCC\x8C\xA7\xFF\x3D\xF5\xD2\x30\x51\x90\xD3\x2E\x9C\x2C\xBF\x03\xBA\x8E\xD3\xC0\xA6\x90\xD3\x7A\xCC\xC2\xCD\x69\xCD\x52\xCD\x97\xD3\x23\xCA\x9D\xCC\x25\xCA\x9F\xCC\x14\xCA\x59\xCD\x31\xCB\x5B\xCD\xC2\xCC\x52\xC6\xF2\xB1\xC8\xCF\xF1\xB8\xC8\xC9\xA4\x81\xCC\xCF\x02\xC4\x09\x01\xB2\xD3\x02\xA7\xA8\xD1\xD9\x9A\xC0\xCD\x56\xCE\xBB\xCE\xDB\xCD\x1A\xCE\x43\xCB\x32\xC9\x45\xCB\x34\xC9\xAD\xCE\xA3\xCA\xAF\xCE\x2D\x91\xD1\xCF\x53\xD2\xB9\x69\xCC\xD3\xE5\xD1\x55\xD3\x53\x99\xD0\xD3\x5D\xCF\x93\xCB\x3E\xCF\x95\xCB\x7E\xCA\x97\xCB\x81\xC9\x99\xCB\x83\xC9\x9B\xCB\x0E\xCD\x9D\xCB\x48\xCF\xCD\xA2\x6D\xCF\x8A\x9E\x8A\xD0\x31\xC6\xB3\xCF\x8D\xC6\x74\xCC\x2E\x7E\xA9\x67\xE0\xD3\xE0\xA5\xB4\xD3\x58\xCC\x94\xD3\xB7\xD3\xC4\xCD\xD1\xCE\xC6\xCD\x6D\xCD\x08\xCE\x0A\xCF\x0A\xCE\x7F\xD3\x0C\xCE\x81\xD3\xAA\xCF\x83\xD3\x9D\xCF\xDC\xC2\xAE\xCF\xE2\xCF\x96\xC9\xA9\xC6\x83\xB9\xFC\xD3\xF2\xA5\xFE\xD3\xE4\xD3\x55\xCB\xE6\xD3\x57\xCB\x07\xCD\xAB\xCD\x0F\xCB\x63\xCF\x8D\xCE\x61\xCC\x50\xC9\x67\xCF\x15\xCB\x69\xCF\xB4\xCD\x4C\xCE\x6F\xC1\x98\xCE\x66\xD3\x75\xCD\xEB\xCF\x04\xD0\xE0\xC3\x06\xD0\x75\xD2\x66\xD0\xC0\xAB\xF0\xCF\x2C\xC1\x15\xD4\x0C\xA6\xCE\xD3\x08\x9B\x42\xCE\xA6\xCD\x3C\xCF\x86\xCD\x6F\xCE\xB6\xA9\x5C\xD3\xED\xCE\x5B\xCE\xC0\xCE\x00\xCB\x61\xD3\x38\xCE\x60\xCE\x1C\xAA\xB1\xD2\xDD\xC6\x7C\xCD\x81\xB9\x61\xCD\x52\xCB\x46\x45\x4F\xA6\xE7\x97\xCF\xD3\x57\xD3\x26\xCB\x00\xD4\x2B\xCD\x5D\xC5\x5C\xCC\xE5\xC5\x41\xCF\x1F\xD4\x8C\xCD\x21\xD4\x8E\xCD\xD4\xCC\x60\xCB\x25\xD4\x62\xCB\x6B\xCF\xF2\xCC\x4A\xCF\x80\xB4\x2F\x9E\xF6\xC5\xB2\xC8\x69\xA8\xE0\xC9\x03\xD0\xF6\xCE\x05\xD0\x7A\xCD\x30\xD4\x1A", "\xC5\x7E\xCD\x36\xCF\x02\x01\x35\xD4\xA7\xD1\x17\xD4\x52\xD4\x2E\xCE\x04\xCF\xDA\xCD\x41\xCB\xDC\xCD\xD5\xD3\xDE\xCD\xD7\xD3\xE0\xCD\xD9\xD3\xE2\xCD\xDB\xD3\xF4\xC6\xFB\xC9\x10\x4E\xFD\xC9\x80\xC3\x44\xAE\x6F\xD4\xBB\xBF\xFF\x00\xE7\xB2\x81\xD2\xCC\x69\x74\xD4\xEA\xA6\x07\x9B\x91\xD3\x3A\xCF\x58\xD3\x79\xD4\x18\xCE\xD3\xD3\xBD\xCE\x40\xD4\xBF\xCE\xEF\xCE\xC1\xCE\xF1\xCE\xC3\xCE\xF3\xCE\x48\x9C\x00\xC4\x0E\x93\x90\xD4\x3B\x0F\x61\x9B\x74\xD3\x97\xCC\x76\xD3\x01\xD4\xA6\xCE\x03\xD4\xA8\xCE\x05\xD4\xAA\xCE\x07\xD4\xAC\xCE\x09\xD4\xAE\xCE\x0E\xCF\x2F\x85\x2C\xCA\x65\xCE\xA4\xD4\x43\xD3\xE2\xD3\x8C\x9B\xFF\xD3\x6D\xCE\x3C\xD4\xE7\xD3\x70\xCE\x96\xCB\x72\xCE\x5F\xCC\x4E\xC9\x5C\xD4\xB0\xCD\x23\xD4\xB2\xCD\xF1\xD3\xCA\xA3\xF3\xD3\x95\x9F\x21\x99\xE5\xCD\x6E\xD3\x03\x01\xB8\xD4\x3D\xB1\x8F\x97\x56\xD3\xA2\xCE\xC2\xCA\x50\xCD\xAA\xD4\x78\xD3\xAC\xD4\x07\xCF\xAE\xD4\x09\xCF\x9B\xD3\x0B\xCF\x9D\xD3\xD8\xCE\x9F\xD3\x15\xB4\x65\xD0\xD5\xA2\x44\x0F\x6A\xC7\x32\x86\x5C\x0A\xD1\xD4\xBB\xD1\xBA\xD4\x36\x9B\xBC\xD4\x3B\xD4\x20\xCF\x87\xCD\x3F\xCF\x1D\xD4\x5A\xCB\x73\xCE\x5C\xCB\x65\xCF\x5E\xCB\x46\xCF\x5F\xD4\xB3\xCD\x61\xD4\x94\xCE\x63\xD4\xCB\xD4\x12\xBE\x7B\xC7\xEC\x8A\x52\xD3\x4F\xD4\x91\x5A\xBB\xD4\x18\xD4\x92\xCB\xA4\x9D\x1B\xD4\xAA\xCD\x4B\xC9\x2F\xCD\xF5\xD4\x0B\xCD\xF7\xD4\x0D\xCD\xF9\xD4\x0F\xCD\x60\xD4\x11\xCD\xFD\xD4\x87\xAA\x4D\xCE\x29\xD4\xD6\xCA\x6C\xD0\x0B\xCC\xE4\xC3\x54\xBA\x1F\xAF\xB7\xD4\x04\xD5\x10\xD2\x3C\x9A\x07\xD5\xE1\xC5\x0B\xCB\x6C\xC8\x2D\xCD\x0C\xD5\xAC\xCD\x0E\xD5\x31\xCD\x10\xD5\x33\xCD\xEF\xD3\x35\xCD\x14\xD5\x37\xCD\x16\xD5\xD9\xB2\x97\xCE\x46\xD4\xEC\xC7\x9E\xC4\xD6\xC0\x20\xD5\xDF\xD0\x90\x97\x24\xD5\x3E\xC6\x26\xD5\x5B\xCC\x28\xD5\x5D\xCC\x4C\xC9\xC3\xD4\x74\xCE\xC5\xD4\x76\xCE\x5E\xD4\x13\xD5\xFB\xD4\x15\xD5\x27\xD4\xD7\xC2\x4E\xCE\x7C\xB9\x3F\xB7\x61\x79\x03\xD5\x3B\xD5\xD4\xD4\x02\xCF\x43\xCE\x96\xD4\x30\xCE\x5B\xD3\x47\xCE\x5D\xD3\x49\xCE\x5F\xD3\x59\xB6\x4C\xD5\x32\xC5\x4E\xD5\x2F\xD0\x3E\xD0\x4F\x8C\x64\xCE\x03\xD2\xE9\xD4\x21\xD5\xBB\x97\xEE\xD4\x4C\xCA\x3D\xCF\x0A\xD5\xF2\xD4\x29\xD5\x1E\xD4\x2B\xD5\xAE\xCD\x46\xD5\x8F\xCE\x48\xD5\xF0\xD3\xA5\xC9\xB5\xC0\xFF\xD4\x2E\xA1\x0F\xD0\xBE\xC2\xF1\xCA\xB2\x8B\xA3\xD4\x68\xD5\x3C\xD5\x77\xD4\xB9\xCE\x57\xD5\x57\xCE\xBC\xCE\x59\xCE\x9A\xD4\x5E\xD3\x42\xD4\x5D\xCE\xC2\xCE\x5F\xCE\xC4\xCE\xF0\xB1\xED\xC4\x5F\xD0\xEF\xC4\x8D\xD3\x80\xD5\x54\xD5\x5E\xC6\x77\xC0\x25\xD5\x5E\xCF\x27\xD5\x0D\xCB\xF3\xD4\x09\xCD\x71\xD5\x64\xCF\x73\xD5\x66\xCF\x75\xD5\x30\xD5\x4A\xD5\x32\xD5\x5F\xD5\x6C\xC5\x61\xD5\x49\xC3\x30\xD0\xB1\xC5\x68\xD0\x93\xD5\x53\xD5\xE3\xD3\x82\xD5\xCE\xCE\x54\xD4\x04\xCE\xB9\xD3\xD0\xCB\x99\xD3\xBC\xCC\x57\xCD\xBE\xCC\x30\xCB\xC0\xCC\x32\xCB\xE3\xD4\xB1\xCE\x01\xCA\xEB\xB4\x2E\xC8\x01\x01\xEA\xD4\x24\xD2\x72\xD3\xB5\xD3\x48\x92\x95\xD3\xE9\xCC\x2A\xA4\x58\xD4\x62\xCF\x9E\xD5\x20\xD4\xC9\xCA\x11\xD5\xC7\xD4\x47\xCF\x77\xD5\xBF\xC7\x79\xD5\x11\xA4\xF5\xD3\x33\x6E\x41\xC8\xC0\xCB\x39\xC5\x31\x90\x20\x9F\xEE\xCF\x6F\xAA\x14\xD4\x94\xD5\xAF\xD5\xD5\xD4\x67\xCD\x0B\xC5\xC8\xD5\x21\xCF\xEA\xCC\xA1\xC9\xEC\xCC\xBC\xC7\xEE\xCC\xC9\xD4\x36\xA4\xD5\xD5\xB4\xA4\xF4\xCF\x73\xC1\x94\xBC\x24\xCC\xB4\xC1\xF7\xCE\xE0\x0E\xF9\x9A\x91\xAA\xFA\xB7\x91\xD0\xAB\xCB\xFD\xB7\xFC\xCE\x42\x6A\xC3\xD5\xE2\xD2\xEC\xD4\x23\xD5\xB0\xD5\x93\xD3\xBD\xD4\xF0\xD4\x3D\xD4\xC0\xBB\xF1\xAA\x18\xBF\xED\xCC\xC6\xA3\xA4\xD5\x85\xAE\x42\xB0\xEF\xD5\x21\xA9\x0E\xBE\xA4\xD0\x4F\xCC\x2A\xCE\x75\xC5\x90\xD0\xCA\xCF\xFC\xB7\x93\xD0\xFE\xD5\x71\x6D\x00\xD6\x49\xD3\x02\xD6\x51\xD4\xE3\xD5\xD8\xCD\x84\xD5\xD2\xD3\x7B\xD4\xD4\xD3\x7B\xD3\xD6\xD3\x7D\xD3\xD8\xD3\xB2\xD4\xDA\xD3\xB4\xD4\x98\xC8\xA6\xCB\x88\xD4\x36\xB8\x99\xC5\xDE\xD5\x92\xBB\xE0\xD5\xAE\xD5\x06\xD5\x04\xD6\xB5\xCC\xD2\xC9\xD0\xCE\x05\xCE\xD2\xCE\x08\xCF\xD4\xCE\xB0\xD4\xD6\xCE\xE0\xD4\x0D\xCF\xE2\xD4\x0F\xCF\x30\xD6\xF8\xC6\xB1\xBB\xC3\xCB\xBF\xD5\x09\xAB\xBA\xC8\x61\xB8\xE6\x65\x1E\xD6\x62\x34\x76\xD4\x22\xD6\x3B\xCF\x6B\xD5\xBE\xD4\x6D\xD5\xE8\xD3\x61\xCF\x7F\xCA\x8C\xCE\x5B\xD4\xCF\xD5\x2E\xD5\x12\xD5\x76\xD5\x27\xCF\x78\xD5\x29\xCF\x6E\xCF\xD7\xD5\xD1\x9E\x63\xD5\xC2\x95\xB1\xD0\x7B\xD2\xDC\xBB\x0F\xD2\xDE\xB4\xE1\xCB\x8C\xCF\x99", "\x77\x51\xD3\x0A\x99\xD0\x99\xCD\xD3\x52\xD6\x55\xD5\x3A\xD4\x55\xD6\x07\xD6\xBF\xD4\x3E\xD4\x5A\xD5\x88\xD5\x5C\xD5\x8A\xD5\x60\xD3\x8C\xD5\x62\xD3\x3B\xB9\x64\xD3\x07\xA1\x2A\xD4\xF5\xCB\xBB\xC2\x9C\xB8\x12\xB5\xE3\xBE\x71\x0F\x6D\xD3\x80\xBF\x5C\x0A\x73\xD6\xE1\xD3\xD3\xD4\xE2\xD5\x76\xD6\x02\xCE\xB2\xD5\x3C\xD6\xB4\xD5\x54\xCD\xBB\xD3\x80\xCB\xBD\xD3\x27\xCA\xA1\xCC\x29\xCA\x86\xCC\x82\xD3\xCA\xB5\xAC\xCF\xB1\xBF\x25\x6B\x68\xD3\xE2\xA0\x82\x96\xB1\xCF\x4D\xB5\x8A\xD3\x0E\xC2\x12\xC9\xC4\xB6\x90\xD6\xFD\xD3\xC5\xD5\x6A\xD5\x7A\xCA\x56\xD6\x5F\xCF\x8B\xC4\x59\xD6\xEA\xD3\x42\xCF\xEC\xD3\x44\xCF\xEE\xD3\x5F\xD6\xA3\xD5\xED\xD5\x8C\xA8\x11\xD6\x1A\xAA\x7B\xD5\xF6\xD3\x3B\x0F\x33\xC6\xC7\x91\x26\xC9\x70\x80\x53\xB5\x48\xCD\xB0\x36\xE1\xD5\x38\xD6\x53\xD6\x95\xD4\x96\xD6\x05\xCF\xDA\xD4\x7A\xD3\x3F\xD6\x7C\xD3\x41\xD6\x7E\xD3\x43\xD6\x80\xD3\x45\xD6\x9A\xCF\x39\xC9\x72\xAD\x12\xC3\x73\xB5\x15\xCF\xAC\x76\xC9\xD3\xFD\x9C\x8F\xD6\xCD\xD6\xED\xD4\x3D\xD5\x47\xC9\x3F\xD5\x2C\xCD\x9B\xD5\x6F\xD5\xF4\xD4\x44\xD5\xF6\xD4\xA0\xD5\xF8\xD4\xD1\xD5\xFA\xD4\xBF\xD6\x1A\xAD\xC1\xD6\xCA\xAF\x65\xD6\x0F\xC9\xDD\xD3\x59\xB7\xA2\x21\xE6\xD6\x03\xD6\xCF\xD6\x53\xD4\x06\xD6\xE6\xD5\xF1\xD4\x58\xD6\x9C\xD5\x8A\xCD\x5A\xD4\x43\xCF\x2D\xD5\x45\xCF\xF3\xD6\x49\xD5\xF5\xD6\x11\xAE\xF7\xD6\x4C\xCF\x0F\xC3\x10\xC9\xFA\xCC\xF9\xD3\xDA\xC8\xB9\x69\xAF\xD6\x16\xD4\xB1\xD6\xE8\xD6\x88\xCE\x48\xC9\x56\xD4\x41\xD5\xCB\xD5\x5A\xD6\xD2\xCC\x7E\xD6\x9C\xD4\x43\xD4\x81\xD6\x45\xD4\x63\xD3\xA1\xD6\xFF\xBE\x65\xD3\x0F\xD4\x9F\xCF\x1D\xCD\xB1\x9C\xCF\xAD\xD0\xB5\x43\xB9\x86\xD0\xA2\xC3\xFD\xD6\x37\xD6\xE7\xD6\x39\xD6\x29\xCD\xD7\xD4\x55\xD4\x7D\xC9\x6E\xD5\x42\xD5\x0D\xD5\xEF\xD6\x0F\xD5\xF1\xD6\xD0\xD5\xA2\xD5\x48\xA3\x25\xD7\x9E\xD4\x8D\xD5\xA0\xD4\x6D\xCC\x3E\xCD\x7E\xC3\xA7\xCB\x9A\xB9\xD2\xC5\x29\xCC\x9C\x89\xC9\xC6\xA9\x67\x18\xD7\x36\xD4\x75\xD6\x96\xD5\x34\xC3\x3E\xD5\x99\xD5\x40\xD5\xEC\xD6\x3E\xD7\x2A\xD5\x40\xD7\x2C\xD5\x42\xD7\x5E\xD6\x0C\xD7\x60\xD6\xC8\xC8\x14\xC5\x48\xC4\x0E\xC3\xDB\xCF\x66\xBD\x19\xAE\x9D\xC3\x4E\xCC\x1A\xD6\x98\xA8\x83\xB9\x54\xD7\x75\xD4\x1A\xD7\x38\xD7\xEC\xCD\x3A\xD7\xB3\xD5\x9B\xCC\x7E\xCB\x9A\xD6\x56\xCD\x9C\xD6\x82\xCB\x9E\xD6\x84\xCB\x68\xD7\x00\xD0\x4B\xD7\x6A\xD4\x1F\xC0\x11\xCF\xB9\xC3\xC4\xC6\xB1\xC9\x9B\xC5\x44\x0F\x71\xD4\x19\xCF\xCC\xD6\x36\xD7\xFF\xD6\x94\xD6\x87\xCE\xCE\xCC\x1D\xD7\x3C\xD7\x05\xD7\xED\xD6\x9D\xD5\x5F\xD7\x72\xD5\x5D\xD6\x0B\xD7\x44\xD7\x8B\xB0\x0F\xD6\xCA\xB1\x10\xD7\xC5\xAE\xC3\xD6\xAA\xC9\xD9\xAA\xDF\xB2\x2D\xD4\xF9\xC6\x2F\xD4\x4F\xD7\xF4\xD5\x9E\xCD\x06\x01\xBC\x8F\xFC\xD6\x09\x01\x71\xD7\x91\xD4\x37\xD4\x93\xD4\xAD\xCA\xE4\xD5\xE0\xC7\xB4\xD6\x9A\xD5\x60\xCF\x06\xD7\x59\xD4\xCD\xD5\x5C\xD6\x0C\xD6\x32\xA4\x0E\xD6\x7C\xB4\x17\xD5\x28\xD4\x36\xD5\x4B\x8F\xA2\xD4\x92\xA9\xB0\xD7\xA5\xD4\xAD\x9A\x57\xD7\x80\xC7\x24\xD6\xEA\xCE\x86\xD5\xEC\xCE\x7D\xD4\x1C\xCE\x7F\xD4\x1E\xCE\x81\xD4\x20\xCE\x83\xD4\x51\x93\xCF\xCD\x54\x98\x66\xD5\x35\xD7\x13\xA7\xBA\x97\x81\xD5\x00\xD7\x78\xD4\xD1\xD6\x7A\xD4\x79\xD3\x7C\xD4\x28\xD6\x7E\xD4\x2A\xD6\x80\xD4\x2C\xD6\x82\xD4\x2E\xD6\xE1\x8F\xCE\xD4\x8E\xD6\xDC\xD7\x54\xD3\x92\xD6\xCE\xD6\x90\xD7\xA3\xCE\x7A\xCB\x3B\xD7\xD0\xCC\x8B\xCE\x22\xD7\x67\xC1\x9C\xD7\xB1\xB9\x9E\xD7\xAE\xB3\x64\xD4\x96\xBE\x44\x9F\xAA\xD5\x51\x8D\x91\xC0\xE9\xAE\x3C\x73\xE5\xD6\x8E\xD7\x21\xD6\xF4\xD7\xD6\xD4\xA9\xD4\xF7\xD7\x8A\xCE\x43\xD5\x5B\xD6\x09\xD7\x61\xD7\x9B\xD7\x4A\xCE\x5E\xD5\x44\xD4\x18\xD5\x73\xCA\x8B\x72\x75\xCA\xAE\xD6\xFE\xD6\x0A\xD8\xCB\xD7\x3E\xCB\xCD\xD7\x5A\xD3\xCF\xD7\x3F\xD4\xD1\xD7\xEE\xCE\xD3\xD7\xF0\xCE\xD5\xD7\xF2\xCE\xD7\xD7\xAE\xD0\xC5\xC4\x43\xC9\x91\xCA\x9B\xC7\x65\xCE\xC8\xD7\xB9\xD4\xF2\xD7\x37\xD7\xE0\xD7\x83\xD5\xE2\xD7\x97\xD4\x26\xD6\x99\xD4\x25\xD8\x41\xD4\x24\xD7\x8B\xD5\x47\xD7\x82\xD6\x2B\xD8\xBD\x7D\x45\xD0\xF9\x08\x0E\x93\x32\xD8\xD2\xD4\xDE\xD7\x95\xD5\x7C\xC6\x52\xC4\x1C\xD7\xEA\xD6\x1E\xD7\x5C\xD7\x20\xD7\xB8\xD6\x08\xD7\xBA\xD6\x0A\xD7\xBC\xD6\x63\xD7\xBE\xD6\xD3\xD5\x49\xCF\xA0\xD7\xB2\xB3\xA2\xD7\x42\xB9\xF0\xC0\x8F\xBA\xCB\xD6\x54\x4A\x1D\xD8\x38\xD4\x5C\xCF\x19\xD4\x09\xD5\xB5\xD6\x33\xCA\xBA\xD7\xCC\xD5\x98\xD7\x9F\xD5\x9A\xD7\x56\xD8\xFC", "\xD7\xF6\xBE\xFE\xD7\x6D\xC1\x00\xD8\x7A\xB9\x66\xD4\x49\xD0\xBE\xD5\x4F\xCB\x52\xD0\x43\x94\xC7\xD7\x63\xD8\xB3\xD7\xC1\xCA\xB5\xD7\xB6\xCC\xD8\xD4\x96\xD3\x78\xD7\x98\xD3\x7A\xD7\x9A\xD3\xB8\xD5\x9C\xD3\xBA\xD5\x9E\xD3\xBC\xD5\x2A\xD0\xBB\xBA\x19\xC1\x7C\xD8\x09\xD8\x64\xD8\xA7\xD4\x4F\xCD\x0D\xD8\x77\xD7\x22\xCF\xC4\xC8\x80\xCC\xC6\xC8\x12\xC5\x65\xD7\x28\xCF\x67\xD7\x16\xC5\xF9\xD6\x89\xD3\x1C\xD1\x91\xD5\x01\xC8\x72\xD6\x7D\xD8\xC6\xD5\x42\xA1\xE3\xD7\xD3\xD6\xE5\xD7\xD5\xD6\x29\xD6\xD7\xD6\x2B\xD6\xD9\xD6\x0A\xD4\xDB\xD6\xCB\xC5\x50\xD0\x95\xCA\x03\xC5\x3C\x0F\x74\x9A\x54\xC7\x47\xD8\xEB\xD4\x34\xD8\x8F\xD7\x1F\xD8\xE8\xCE\x21\xD8\x93\xD7\xF8\xD7\x10\xD8\xFA\xD7\x62\xCC\x70\xD8\x11\xC0\x72\xD8\xD5\xC2\x74\xD8\x4F\xBE\x02\xD8\x67\xD6\xFA\xCF\xC8\xCE\x72\xD4\x71\x61\xA6\xD8\xB2\xD6\xA4\xCE\x82\xD8\xC9\xD5\xEC\xA9\x5D\xD7\x70\xD5\x6C\xD8\xCE\xD5\xBE\xD7\x5D\xA4\x0E\xD7\xA0\xAE\x5B\xD8\xCF\xBB\xF1\xD5\xB1\xC1\xF3\xD5\x31\xD4\xCC\x9A\xDC\xD5\x6C\xAA\x9E\xD0\x47\xC8\x33\xD7\x49\xC8\xCC\x69\xBA\xD8\xC4\xD5\x20\xD6\x92\xD8\x92\xD3\x3A\xD6\xAF\xCA\xD2\xD6\x3D\xD6\x04\xD4\xB6\xD5\xC8\xCD\xDE\xD4\x08\xD4\xB0\xD8\xB3\xD4\xB2\xD8\x68\xBB\x9E\xC2\x8C\xBB\x90\xC1\x66\xB4\xF9\xD5\x70\xCB\x31\xD4\x2F\x82\x70\xD7\xD2\xD8\x1B\xD7\x92\xD7\x4E\xD8\x94\xD7\xC0\xD4\xE9\xD3\xC2\xD4\x11\xD8\x54\xD8\x13\xD8\x6F\xD8\x15\xD8\x6B\xC1\x33\xD5\xD4\xB7\x4B\xCF\xA1\xD7\xA0\xD8\xF2\xD5\x75\xCD\x84\xB4\x12\xCF\xB6\xC1\x18\xD6\x6D\xD7\x33\xCF\x18\xCF\xCB\xC9\xF0\xD7\x71\xD3\xF0\xD8\x7E\xD8\xC7\xD0\x0C\xD8\x30\xCA\x6C\xD5\x68\xD8\x58\xCB\x6A\xD8\x21\xD7\x48\xCE\xFB\xD7\x15\xD9\x68\xC5\x17\xD9\xF1\xBA\x19\xD9\x5C\xD8\x1B\xD9\xE3\xD8\x1D\xD9\x5E\xC8\x15\xD0\xD3\xC1\x22\xD9\x92\xD0\x35\xD6\x1C\xD6\xFB\x69\xEE\xD8\x01\xD6\xBC\xD8\x1E\xD8\x4B\xD8\x5F\xC6\x98\xD5\x1A\xD4\x2E\xD9\x1C\xD4\x96\xD7\x07\xD7\xBC\xD7\x12\xD8\x6E\xD8\xBC\xAE\x80\xBB\xDE\xD8\xA7\xAF\xE0\xD8\x7A\xBF\xE2\xD8\x8F\xA4\x9B\x8F\xB3\xC8\xB0\xBB\xB5\xC8\x4A\xD6\x50\xD7\x4C\xD6\x03\x01\x0B\xD3\x54\x9B\x17\xD7\x09\xD9\x74\xD7\x1E\xCF\x2C\xD9\xB7\xD7\x5B\xD7\xB9\xD7\x4F\xD9\xBB\xD7\xDA\xD8\xBD\xD7\xEB\xD5\x0D\xD6\x56\xD9\x10\xD6\x63\xD6\xF4\xD3\x1E\xCB\x2D\xD8\x13\xCC\x25\xCC\x69\xD6\x6F\xD6\x2C\x82\xD2\xC8\xBF\xB0\x78\xCF\xFE\x8E\xDB\xB4\x71\xD6\xC4\xB6\xD8\x99\x91\xD8\x29\xD9\xEC\xC9\x23\xD6\x38\xD8\x58\xD5\x23\xD8\x7C\xD6\x3C\xD8\x9B\xD4\x27\xD8\x9D\xD4\x29\xD8\x9F\xD4\x71\x88\x0C\xD4\xA2\xD6\xDE\xCF\x90\xC9\x62\xC3\x92\xC9\xA1\xCF\xF3\xC8\xB7\x79\x02\xAD\x15\xD7\x38\xB3\xCC\x69\x86\xD9\xDD\xD7\x50\xD4\xF1\xD8\x94\xD4\x01\xD7\xEF\xD4\x03\xD7\x08\xD6\x71\xCE\x0A\xD6\x36\xC0\xDC\xD8\xAC\xA4\x74\xD9\x9F\xD7\x76\xD9\x4E\x97\x84\xD6\x66\xA7\xEE\xC8\xE0\xCF\x88\xD6\x24\xAD\x15\xC6\x51\xC6\x8D\xC2\xB4\xCF\xAD\xD6\x03\xBA\xA3\xD9\xF1\xD7\x49\xD8\x93\xD6\xBE\xD8\x03\xCF\x8B\xD9\x85\xD5\x98\xD4\x87\xD5\x8F\xD9\x89\xD5\x3E\xD8\x80\xD6\x40\xD8\x27\xD7\x49\xD7\x1E\xA8\x23\xC9\xBB\xCF\xA4\xD3\xE1\xD6\x5C\xA1\x38\xAC\x27\x01\x4F\xD3\x90\xD1\xC3\xCC\x2C\x84\x86\x34\x81\x0C\x12\x3E\x89\x34\x12\xD3\x51\xD6\x72\xD3\xAF\xD3\xFC\xC2\x85\xD9\x67\xD9\x36\xD8\xB1\xD5\x02\xD7\xD5\xD8\xE7\xD5\xCA\xD5\xC7\xCA\x47\xA9\x53\xD9\x30\xB6\x45\xD7\x3F\xD8\x93\xD9\x48\xD7\x42\xD8\x47\xD4\xC3\xD3\xEF\xB8\xC5\xD3\x51\xB5\xE3\xD6\x8D\xAB\x5C\x0A\xC1\xD9\x27\xD9\x47\xD9\xA6\xD9\xB4\xD7\x8A\xD9\xEB\xD9\x0E\xD8\x59\xD5\xF9\xD7\x32\xD9\xC5\xD8\x34\xD9\x88\xC9\x36\xD9\x15\xC0\x38\xD9\xE1\xD8\x5D\xD8\xFA\xD6\x2E\xC3\x0F\xB9\x00\xDA\x8F\xD3\x73\xD7\xE9\xD9\x05\xD6\xA9\xD9\xEC\xD9\x04\xD7\x0E\xD9\xB7\xD6\x10\xD9\xC4\xD8\x22\xD4\xC6\xD8\x94\xC4\xC8\xD8\x6A\xC5\xCA\xD8\x47\xC3\x76\xD8\x04\xCB\xF9\xCC\xF8\xD3\x7F\xBF\x53\xCC\xFF\xD9\xE8\xD9\x0B\xD8\x80\xD8\x3B\xD6\xF5\xD8\x98\xD6\x6C\xCD\xF8\xD8\x06\xD4\xFA\xD8\xB1\xD4\xFC\xD8\x2D\xD6\x8F\xBF\x29\xD7\xB8\xC2\xDF\xCF\x8A\xCC\x25\x84\x11\xD4\x9D\xC4\x40\xBD\xEB\xD8\x66\xC8\xA2\xD9\x30\xDA\xC5\xD9\x56\xD5\xC7\xD9\x25\xD6\xE4\xD7\x27\xD6\xAC\xD8\xE7\xD7\xAE\xD8\xE9\xD7\x3B\xDA\xEB\xD7\xFE\xD8\x0F\xC7\x01\xD0\xF2\xB5\xC1\xC6\x80\xD0\xE3\xC9\x87\xD7\x44\xCD\x18\xD0\x85\xC3\x46\xDA\x8C\x0E\x42\x6A\x16\xDA\xB3\xD3\x18\xDA\x31\xDA\x05\xDA\x1B\xDA\x07\xDA\x8D\xD9\x09\xDA\x5B\xD5\x33\xD9\x5D\xD5\x16", "\xD9\xA6\xD5\x7B\xC8\xF5\xCC\xC3\xC7\x12\xD7\xD1\xBF\xF7\xCF\x1C\xB6\xD6\xD9\x99\xC7\x1D\xAE\x83\xB9\x64\xDA\x74\xD6\x66\xDA\x4A\xDA\x77\xD6\xB3\xD6\x79\xD6\x57\xD6\x1E\xDA\x30\xD9\x52\xD8\x51\xD9\x12\xD9\xF1\xD9\x0F\xC0\xF3\xD9\xCE\xD9\xF5\xD9\x41\xD8\xEC\xD7\x57\xDA\x82\xD7\x02\xD0\x84\xD7\x2E\xCF\x21\xC0\xE4\xC9\xA9\xD7\x06\xD9\x43\xB6\x43\xD9\x48\xDA\x87\xD9\xA7\xD8\xC6\x93\xA9\xD8\xF6\xD8\xAD\xD4\x37\xDA\xAF\xD4\x39\xDA\x42\xD6\x8A\xD8\xE1\xD4\x8C\xD8\xB4\xC3\x99\xCD\x12\xD0\x94\xDA\x9A\xD0\x65\xD9\x4E\xD7\x34\xD6\x8C\xD4\x1A\xD0\xCA\xD3\x06\x01\x7D\xDA\x91\xD6\xC3\xD9\xF3\xD7\x80\xDA\x95\xD6\x06\xDA\x96\xD8\xE8\xD5\x23\xCF\xEA\xD5\xA3\xC9\xEC\xD5\x59\xD8\xF2\xD3\xB3\xD9\xE5\x9F\x02\xA9\xBB\xCD\x8D\xAE\x65\xCE\xB6\xDA\xB0\xD6\x28\xD9\x9E\xDA\x07\xAA\x39\xD8\x4E\xDA\x3B\xD8\xE6\xD7\xD2\xD7\xE8\xD7\xD4\xD7\xEA\xD7\xD6\xD7\x90\xDA\x42\xC7\xD9\xD7\x98\xA2\x15\xDA\x49\xDA\x49\xD9\x97\xD5\x59\xD7\x4C\xD9\xB8\xD7\xB6\xD6\x86\xDA\x20\xDA\x0A\xDA\x22\xDA\x0C\xDA\x87\xCA\x0E\xDA\x98\xC4\x10\xDA\x59\xD9\x12\xDA\xE9\x6B\xEE\xD7\x2E\xDA\x27\x01\xCB\xDA\x19\xD7\xCD\xDA\xD3\xD8\xF6\xD7\xBD\xDA\xEE\xD9\xEB\xCC\xC8\xCA\xAF\xD9\xD3\xA4\xB1\xD9\xFF\xD7\x58\xD9\x34\xC5\x3A\xD9\xA1\x86\x68\xC7\x4C\xC4\x9E\x98\xDF\xB6\x09\x01\xF4\xDA\x55\xD7\x7F\xDA\xDF\xDA\x58\xD7\xE9\xD6\x5A\xD7\xEB\xD6\x6D\xD9\xD8\xD8\xEE\xD6\x11\xD9\xFE\xA2\x3D\xD8\x91\xD9\x46\xD7\x8E\xDA\xD0\xD9\x0D\xCE\x1A\xD8\x0F\xCE\xE7\xD9\x9D\xDA\xF7\xDA\xCC\xCB\xAA\xD9\x7A\xD6\x09\xD6\x0A\xB6\x16\xDB\x90\xD9\xD5\xDA\x28\xD8\xD7\xDA\x2A\xD8\xD9\xDA\x2E\xD0\x1B\xD5\xEA\xC9\x2F\xD8\x9E\x08\x0E\x93\x0A\xDB\x72\xD7\xF6\xDA\x0A\xD9\x59\xD3\xC1\xD8\x0F\xD8\x3F\xD7\x15\xDB\x61\xB0\x54\xD9\x69\xC1\xC0\xD7\x9D\xB6\xC2\xD7\x4D\xD5\x19\xD5\xC5\xC7\x40\xAF\x39\xD5\xDB\xD7\x09\xDB\xDE\xDA\x39\xD4\xBB\xDA\x69\xDA\xF9\xDA\xD7\xD8\x51\xD8\xE6\xDA\x6D\xDA\x0B\xDA\x6F\xDA\x35\xD9\x71\xDA\x8C\xC9\x73\xDA\xD4\xCA\x03\xDB\x50\xD5\x0B\x81\x94\x92\x34\xDB\xB1\xD7\x56\xD7\x0D\xDB\xCC\xD7\x4C\xDA\xCE\xD7\xC9\xD9\xD0\xD7\xD3\xDA\x26\xD8\x29\xDB\x92\xD9\x2B\xDB\x94\xD9\x2D\xDB\xD8\xC7\xB4\xD8\xAB\xCA\x6D\x90\x65\xD5\x8E\xD4\x2F\xDA\x20\xDB\x37\xDB\xC0\xD8\x0C\xD9\xC2\xD8\x3B\xDB\x21\xDA\x5D\xD4\xE9\xDA\x66\xCC\x17\xD8\xC3\xD7\x8E\xD5\x94\xB3\x8E\xD8\xEE\xC7\xCA\xDA\x4A\xDB\x65\xD8\x08\xD5\x06\x9F\xE3\xDA\x69\xD8\x6E\xD9\x6B\xD8\x3C\xDB\x1F\xBB\x3E\xDB\x64\xCC\x40\xDB\x25\xBB\x42\xDB\x60\xD5\x44\xDB\x38\x7E\x05\xCB\xB0\x9E\x07\xCB\x61\xD8\x01\x01\x5E\xDB\xC9\xD7\x92\xD4\xCE\xDA\xEB\xAA\x39\xDB\x08\xDA\xC3\xD8\xE7\xDA\x7C\xDB\x54\xDB\x0D\xDA\x56\xDB\x8B\xCA\xA8\xD5\x5A\xD9\x03\xD8\xAE\xDA\xAC\xD5\x1F\xDB\xA4\xD9\x05\xD5\x35\xD8\x67\xDA\x54\xD6\x82\xDA\x23\xDB\x84\xDA\x7B\xD6\x6C\xDA\x7D\xD6\x6E\xDA\x7F\xD6\x16\xD8\x26\xD7\x18\xD8\x81\xDB\x55\xA9\xCD\xD8\x09\xD0\x8E\x10\xCF\xD8\x8C\xD7\x02\x01\x9D\xDB\x33\xD8\xB8\xDA\xB3\xDB\xBA\xDA\x91\xD7\x38\xDB\x78\xDB\x3A\xDB\x5E\xD7\x8E\xDB\x0E\xC4\x90\xDB\x90\xCD\x92\xDB\x43\xC3\x94\xDB\xA7\xD5\x96\xDB\x5F\x6E\xD9\xD5\x85\xD7\x43\xC8\xE7\xD8\x3B\xC5\xE9\xD8\x79\xD0\x9B\xDA\x74\xDB\xB1\xDB\x22\xD5\x48\xD9\x4B\xDB\xCE\xDB\x77\xDB\x10\xDB\x4F\xD8\x12\xDB\x50\xDB\xAD\xD9\x81\xCA\xFD\xDA\xF4\xA9\xFF\xDA\x73\xD8\x01\xDB\x6E\xC5\xEF\xDA\x1C\xD9\x89\xCF\xB0\xC5\x95\xDA\x52\xBB\x91\xC1\x2B\xB0\x61\xC8\xC7\xD3\xFA\xCF\x74\xCB\x25\xD9\x49\xDB\x75\xDB\x68\xD9\x75\xD3\x6A\xD9\x83\xDA\x4D\xD9\x0B\xD5\x13\xDB\x97\xD7\xD3\xDB\x9A\xCB\xD5\xDB\x78\xCE\xD7\xDB\xEF\xC5\xD9\xDB\x72\xDA\xAB\xDB\xF8\xDB\x3B\xD9\xAF\xC5\x1E\xD9\x12\xCE\x8B\xCB\x1B\xB8\xE2\xDB\x6F\xBB\xE3\xAA\x7A\xC5\x03\x01\xC9\xDB\x48\xD8\xA5\xD9\x88\xD9\x0A\xCA\x68\xDA\x78\xD6\xB7\xDB\x0B\xDC\x3D\xD7\xEF\xDB\x26\xDB\x3D\xDB\xF2\xD9\x9D\xD7\xC1\xD7\x34\xD5\xED\xDA\x02\xDB\x13\xD6\x47\xD6\xA6\xD7\xF7\x0B\x3F\xD9\x01\xDC\xC4\xDB\x42\xD9\xFC\xCF\x9E\xC5\x00\x00\x24\xDC\xBB\xD8\xCB\xDB\xBD\xD8\x61\xDB\x20\xD8\x63\xDB\x22\xD8\x65\xDB\x24\xD8\x67\xDB\x17\xDB\x69\xDB\x19\xDB\x6B\xDB\xF6\xD9\x6D\xDB\xD8\xAA\x3C\xD9\x01\xD9\xA6\xD0\xAE\x9B\x98\xB0\x19\xD6\x33\xCF\xAA\xD0\xD3\x9A\x63\xDA\x86\xDB\x93\xD8\x84\xCD\x09\xDC\x2B\xDC\x8A\xDB\x2F\xD9\x8C\xDB\x31\xD9\x52\xDB\xE8\xDA\xA7\xDB\xEA\xDA\xA9\xDB\x1B\xCB\x17\xDC\x03\xDB\xAD\xDB\xE0", "\xA4\x7C\xD9\x74\xD2\x98\xDA\x7F\xD9\xDF\xCB\x85\x90\xFF\xCE\xE5\xCE\x7B\xB8\x2F\xAB\x72\x76\xAD\x23\x3C\xD3\xD6\xCF\x7B\xDC\x51\x77\x7D\xDC\xF7\xD3\x1E\xD1\xDB\xBD\x5C\x0A\xB7\xD2\xC2\xD9\x26\xDC\x47\xA7\xF7\xA4\xEE\x00\x81\xDC\xBA\xD0\x9D\xBE\xF9\x75\x8C\xDC\x59\x8E\x3C\x06\x92\xD2\x97\xC2\xA5\xD2\xD5\x3C\xA7\xD2\xAC\xD3\x71\x9A\x84\xD2\x50\x9C\xB7\x9B\x88\xCF\xFB\x69\x9D\xD2\x35\xD1\xC2\x3C\xBC\xD2\x90\xDC\xC0\x6F\xA2\xA5\xF0\x00\x7E\xCF\xA6\x90\xC5\x7D\x30\x46\x8A\xCF\x8E\xD2\xA3\xD2\xA2\xDC\x70\x80\x96\xCF\xDC\xCF\xE6\x65\x66\x9A\x5B\xB1\x28\x58\xCC\xDB\x46\xDC\xBF\xD8\x48\xDC\xA2\xDB\x6B\xDA\xA4\xDB\x67\xDC\xA6\xDB\xBD\xDB\x70\xDA\x7F\xDB\x43\xDB\x69\xCC\xB1\xDC\x68\x8F\xA3\xD6\xB7\xD9\x41\xDA\x03\xBF\x89\xD6\xBD\xC2\xE4\x9B\xA4\xCF\xA0\xD9\x95\x91\x71\x6D\xB3\xDC\x29\xD1\xB5\xDC\x45\xDC\xE9\xDB\xF5\xD7\x22\xDB\x1C\xDA\xAB\xD9\xC1\xD4\xF0\xDB\x60\xCC\x8A\xDA\x3F\xC3\x8C\xDA\xBE\xDB\xCF\xD9\xC0\xDB\x83\xD6\x3E\xDA\x84\xD3\x81\x6D\xDD\xC2\x2D\xB5\x71\xCC\x26\xBF\xAB\xD6\x11\xC9\xBF\xB8\x0A\x99\xD1\xDC\xA0\xDC\x83\x35\xDF\xD7\xB4\xDB\xD0\xD6\xBC\xDA\x97\xD6\x84\xD8\xBA\xD3\x99\xD8\x9E\xCC\x9B\xD8\x83\xCC\x66\xD7\xCA\xC8\x80\xD7\xF5\xC2\xA1\xD3\xAF\xA7\xA3\xD3\x25\xC9\xA5\xD3\xC1\x6F\x09\x01\x93\xDC\x34\xD0\x40\x75\xDB\x07\x24\x5F\x9E\x55\x48\xD3\xAC\xDC\xAA\xD2\xDD\x63\xBE\xCF\xC0\xCF\xAA\x0C\xB2\xDC\x21\xD1\xD3\xDC\xE8\xDB\x87\xDB\x4B\xD9\x67\xD8\x63\xDC\x4E\xD9\x0D\xDC\x50\xD9\x70\xD9\x52\xD9\xF2\xDB\x66\xAD\xF4\xDB\xC9\xD8\xF6\xDB\xFD\xC3\x18\xDC\xD5\x7D\x11\xC3\x3B\xC9\xE0\xD6\xFB\xD5\x75\xB5\x16\xC3\x53\x8F\x0F\xB9\xEF\xDC\x1E\x65\x99\xDC\x27\xDC\xD9\xC1\x32\xDA\xF4\xD8\xA0\xDA\x35\xDA\x06\xCE\xDC\xD4\x40\xD6\xA5\xDA\xD8\xD6\xA7\xDA\x44\xD6\xA9\xDA\xDC\xD3\x14\xDA\x65\xCE\x32\xDD\x1D\x65\x34\xDD\xA0\xDB\x34\xAD\xD0\xDB\xA3\xDB\x7A\xDB\xA5\xDB\xC6\xD4\x23\xDA\xCD\xCA\x25\xDA\x8A\xC9\x27\xDA\xF3\xC5\x29\xDA\x8F\xD5\x7E\xDC\x14\xD7\x2D\xDA\xA9\xD3\xCC\x69\x46\xDD\x38\xA7\x17\xDD\x03\xDA\x7F\xD8\x29\xDC\xB6\xDB\xD8\xDC\x24\xDB\xAC\xD9\x2F\xDC\x8F\xDB\x31\xDC\xFD\xD7\x33\xDC\x18\xD9\x65\xD4\x8F\xC9\x4A\xD7\x9A\xD9\x59\xB2\xA7\xC6\x8B\xD6\xFF\x00\x21\xCD\x04\xDC\x06\x01\x5D\xDD\x1B\x65\x48\xDD\x21\xDB\x68\xCD\x6A\xDA\x4A\xDC\x8E\xD9\x4C\xDC\x28\xDB\x52\xDA\xD6\xDA\x54\xDA\xD8\xDA\x56\xDA\x58\x8F\xF5\xC6\xAC\xC9\x7F\xC3\xEC\xCF\xFF\xC9\x98\xDA\x1A\xC5\x33\xD4\xCF\xD4\x02\x01\x78\xDD\x1A\x65\x7A\xDD\x76\xDB\xB9\xDC\x4B\xDD\xBB\xDC\x4D\xDD\xBD\xDC\x4F\xDD\x7D\xDB\x92\xCD\xEB\xDA\x91\xC7\x35\xDC\xF7\xDB\x03\xDB\x2C\xD2\xC6\xC9\x78\xDA\x2D\xDD\x36\xCB\x7B\xDA\xE4\xDB\x27\x01\x92\xDD\x4B\xB1\x5F\xDD\x35\xDD\xA9\xC2\xEA\xDB\x96\xDD\xEC\xDB\x0D\xD9\xB9\xDB\xBC\xDC\xBB\xDB\x53\xDB\xBF\xDC\x55\xDB\xC1\xDC\x95\xDB\xC4\xD7\x40\xDA\xBE\x67\xB3\xBF\xB8\x0E\x77\xCD\xFC\xDB\x99\xB9\xFA\xC6\x84\xD0\xA5\x8F\x83\xB9\xAB\xDD\x42\x63\x94\xDD\x07\xDC\xA8\xD4\x61\xDC\x64\xDD\xB8\xDB\x25\xDB\x0C\xC4\x27\xDB\xCC\xD9\x18\xDB\xF4\xD9\x50\xDC\x8F\xDA\x86\xDD\xDD\xC9\xAF\xC5\xA5\xD7\x6C\xD4\x2E\xD4\x6E\xD4\x8D\xDD\x8B\xD4\x8D\xD4\xDE\xD3\x42\x6A\xC8\xDD\x5D\xD1\xA1\xDC\x4A\xD8\xD5\xDC\x2B\xD9\x04\xCD\x07\xC4\xD9\xDC\x0F\xD9\xDB\xDC\xC4\xD4\xDD\xDC\x8B\xC7\xDF\xDC\xC0\xDC\xBF\xDB\x80\xDB\xD1\xD9\xAE\x6C\xC6\xD7\x31\xDD\x16\xDD\xE6\xDD\xC4\xD9\xB7\xDC\xC6\xD9\xF5\xDC\x34\xDA\xF7\xDC\xB5\xD5\x86\xD8\xB7\xD5\x7C\xD7\x58\xCD\x7E\xD7\x5A\xCD\xFF\xDC\x48\x80\xB6\xD4\x48\xDB\x77\xDD\xFA\xDD\xF1\xDC\xE7\xDD\x19\xDD\xE1\xDA\x1B\xDD\x6C\xD9\xE4\xDA\x65\xDC\x87\xDA\x20\xDD\x89\xDA\x22\xDD\x5B\xAE\x24\xDD\x26\xDA\x26\xDD\x5A\xC9\x5A\xD9\x2B\xD0\xEE\xDC\x0E\xDE\xAD\xDC\x10\xDE\x5F\xDC\xC1\xCD\xC7\xD5\xCE\xDD\x2C\xDC\x95\xD7\x1E\xDD\x6F\xD9\x0F\xDC\xED\xD3\x11\xDC\x91\xCE\x13\xDC\x5A\xCA\x15\xDC\x57\xDB\x6D\xDC\x78\xD9\x2F\xCC\x69\xAA\x05\xD8\x08\xDB\x0D\xDE\xB4\xDC\xFB\xDD\xB9\xDA\xFD\xDD\x4B\xDA\xFF\xDD\x39\xDD\x01\xDE\x99\xD6\xF9\xDC\xBC\xD3\xFB\xDC\xA0\xCC\xFD\xDC\x85\xCC\x8C\x7E\x3F\xBA\x2C\xC1\xE4\xDD\x43\x0F\xCA\xDD\x19\xDA\xF3\xD8\xED\xCD\xF6\xDC\x97\xD8\x7F\xCC\x24\xCF\x81\xCC\x48\xDE\xBE\xD3\x07\xDE\xC0\xD3\x09\xDE\x20\xAB\x6F\xDB\xBF\xCA\x6E\xD0\x40\xD0\x73\xDB\xAA\xDD\x23\xDE\x10\xDD\x25\xDE\xF2\xD8\x39\xD7\x95\xD8\x55\xDE\xBE\xDA\x98\xD8\x58\xDE\x9A", "\xD8\x26\xCF\x9C\xD8\x62\xD6\x9E\xD8\x96\xCD\x5A\xDB\x44\xD8\x97\xB3\xE4\xD6\x65\xDE\x3D\xDE\x0F\xDE\xFC\xDD\xE8\xDD\x37\xDD\x54\xDE\x00\xDE\x56\xDE\x9C\xCC\x46\xDE\x9B\xD6\x5A\xDE\x9D\xD6\x4A\xDE\xA2\xCC\x5E\xDE\xBA\xCA\xC6\xC7\x4C\xD0\xC4\xB6\x4F\xDE\x6B\x73\xAD\xDD\x49\xDD\x03\xB2\xBA\xDC\x7E\xDD\xBA\xDB\xCB\xD9\x23\xD7\xD4\xDD\x8D\xDA\xD6\xDD\x1B\xDB\x52\xDC\x77\xD8\x60\xDE\x02\xCC\xD9\xCA\x44\x0F\xDB\xCA\x0C\xDE\x65\x9A\x66\xDE\xCF\xD2\x78\x5A\x18\xDD\x26\xDE\xD1\xD3\x64\xDB\x3A\xD8\xCA\xD9\x80\xDD\xD3\xDD\x4E\xDC\xD5\xDD\x84\xDD\x2C\xDB\xD8\xDD\x37\xD0\x8E\x10\x82\xCE\x45\xDD\xA6\xDE\x35\x12\x40\x38\xF2\xDC\xCD\xDB\xD6\xDC\x7C\xDD\x4E\xDB\xC6\xAA\xEF\xD9\xF0\xA9\x1A\xDE\xA3\xAF\x1C\xDE\x53\xDD\x1E\xDE\x5F\xCA\xA2\xDD\x98\xDB\x1E\xAA\x9A\xDB\xFC\xCC\x91\xDD\xBA\xDE\x14\x03\xA2\x5F\x3F\xDE\x7E\xDE\x62\xDD\xD4\xD8\x7D\xDD\xAD\xDE\x66\xDB\x50\xDA\xD4\xDA\x82\xDD\x2A\xDB\xB3\xDE\x6C\xDB\xB5\xDE\x3C\xD0\xE4\xD4\x57\xA9\x04\xC5\x3C\xAA\x94\x92\x8F\xDE\x3B\x0F\x51\xDE\xF3\xDC\xA8\xD9\x2A\xDC\x29\xDE\x1C\xDD\x0C\xDC\x2E\xDC\xD1\xDD\x30\xDC\x8B\xDA\x32\xDC\x41\xDB\x34\xDC\x65\xD4\xCC\xD8\xE3\xDE\x24\xCE\x6F\xD0\x61\xDA\x39\xCB\x5C\x0A\xE8\xDE\xCC\x7C\x3E\xDE\xB6\xDC\xD5\xDE\xB5\xDB\xD7\xDE\xC1\xDE\x9B\xAD\xC3\xDE\x9D\xB1\xC5\xDE\x94\xB2\xC7\xDE\x89\xCA\x54\xDD\x42\xCA\x56\xDD\x36\xC5\x75\xD0\xA6\xD7\x77\xD0\x1F\xDC\x48\x0F\x51\xCB\x79\xB0\xA5\xDE\x7B\xDE\x24\xDE\x7D\xDE\x11\xDE\x0F\xDB\xE2\xDA\x14\xDE\x8B\xDB\x2C\xDE\x8D\xDB\x7B\xDB\x9B\xDD\x69\xDC\x7E\xDB\xF4\xDD\xC2\xDC\xC1\xDB\x32\xB8\xDD\xDB\xC2\xDD\x50\xC5\xFE\xDB\xF9\xB7\x05\xD9\x1A\xC5\x03\xDC\x62\xCD\xFF\xDE\xD1\xDE\x73\x38\xAF\x5F\x92\xDE\xB2\xAE\x4D\xDA\xAA\xD8\x4F\xDA\x3C\xDD\xD6\xD6\x3E\xDD\xAF\xD8\x40\xDD\xDA\xD6\x42\xDD\xFF\xD8\x1A\xDC\x3D\xD9\x81\xCF\xDA\x02\x21\xD9\x3C\xDC\x54\xC5\xFF\x00\x24\xD9\x35\xDF\x7A\xDE\xD2\xDC\x02\xDF\xD4\xDC\x1E\xDF\x4D\xD8\xB2\xDD\x79\xDB\xD2\xDB\x25\xDF\x47\xD5\x9C\xDD\x7A\xCE\x9E\xDD\x65\xCB\xA0\xDD\x27\xDD\x03\xDB\x58\xB8\x39\xDC\xA6\xB4\x33\xD6\xC5\xDD\xA0\xC8\xA9\xDD\x09\x01\x00\xDF\xE5\x7C\xBB\xDE\xBC\x9B\xBD\xDE\x40\xDE\x81\xDA\x06\xDF\x6C\xDE\xFA\xDA\xE9\xD5\xFC\xDA\x72\xD9\xBF\xD7\x0D\xDF\x19\xCB\x0F\xDF\x58\xDB\x11\xDF\x94\xC5\x38\xDC\xDC\xDD\x1D\xC5\x5B\xB8\xC1\xB4\xA6\xDD\x39\xB8\x56\xCF\xC6\xCB\x58\xCF\xE3\xDD\x37\xDF\xBC\xDE\x68\xDE\xA7\xD9\xE1\xD7\x42\xDE\xD0\xDA\x3D\xDF\xD2\xDA\xDB\xDE\x68\xDB\xDD\xDE\x6A\xDB\xDF\xDE\x51\xDC\xE1\xDE\x9E\xDE\x2F\xDB\x08\xCA\xDB\xCB\x6A\xD6\x94\xCF\xEC\xD8\x75\xDC\x7A\xD2\x7D\xD9\x20\x87\xC1\x6B\xCA\x6F\xC0\x10\xF1\x00\x18\x70\xC0\x10\xF2\x00\x57\xBE\x85\xAB\x50\x7D\xC6\x3F\xE2\xD9\x81\xDF\x21\x57\x9A\x3F\x2D\x9A\xFC\x6A\xCF\x33\x17\x40\x0E\x36\x98\x5A\x49\x16\xA3\xDC\xB7\x6B\xCF\xB0\xF3\x00\xA7\xDC\x7A\xC2\x80\xCF\xC1\xA1\x04\x7F\xD5\x55\x45\xD3\x24\x8E\x27\x01\xF4\x00\xA8\xD3\x56\xDC\xA8\x02\x05\x61\x70\xA8\x80\x5B\xDC\x6B\xAF\x75\xBE\x70\x21\xA7\xC1\xCF\x62\xCD\xCB\xDF\x1B\x38\x69\xAB\x80\x5B\x2F\x09\xD2\xDF\xC1\x8B\x8D\x05\xE9\xD2\x0A\x64\x58\xA6\x25\xA7\x77\xA6\xEB\x7C\xBE\xD0\x72\x74\xEA\x75\xD7\xBA\x48\x0F\x35\x45\xF8\x00\xCC\xDE\x71\x0F\x10\x66\x90\x4F\xFA\x9F\x3C\xD1\xB6\x77\xC9\xDF\xDF\xDB\x27\x0B\x5F\x64\x24\xAC\x9C\xA3\x2C\x56\x58\xA3\xCF\xDF\x09\x01\x87\xD2\x42\xBE\xB8\x46\xCB\xAC\x1E\x9F\x12\x08\xF4\xDF\x2D\xAC\xF6\xDF\x7D\xA3\x4B\xA4\xC8\xD1\xD4\xAB\x89\x3B\x78\x6B\xEC\x0C\x65\x38\x2A\x41\x01\xDF\x83\x35\xAF\x26\x21\xB1\xDA\x7A\xFB\x00\xF1\xDF\x15\xC2\xCC\x09\x76\x64\x67\x64\xEF\xD8\x14\xA7\xD3\x5B\xF9\xDF\x06\x01\xFC\x00\xBE\x70\x02\xB1\xC3\xD2\x58\xBE\xA6\x07\x06\x96\x1F\xD6\x19\xE0\x4F\xA5\x2F\x09\x1F\xE0\xE6\xDB\xC1\x38\xDD\xDF\x06\xB1\xE0\x01\xBB\xDF\x7F\x83\xA9\x5C\xFD\x00\x2E\xE0\x9B\xBE\x04\x97\x1F\x54\x8A\xB7\x48\x0F\x02\xD1\xE0\x99\x3F\xA7\x1D\x65\x34\x62\x5C\x0A\x41\x00\x62\x71\x2F\xA7\xC8\x7C\x2F\xD1\xF4\xAF\x17\x65\x32\xD1\x5C\x0A\x3A\xE0\x1C\x65\x34\x62\x7F\xD0\xEF\x53\xE9\x36\xE3\xAC\x28\x65\x3B\x74\x31\xA7\xE9\xCB\x36\x10\x60\x66\x40\x10\xC6\x00\x0C\xBE\x55\xE0\x28\x9F\xDB\x6E\x56\x29\x2B\xE0\x3B\xA9\xB3\x33\xAC\x66\x01\x00\x53\xE0\x27\x01\x1E\xA5\x10\x73\xDE\x72\xDF\xD2\x59\xE0\x40\x29\x5B\xE0\xAB\xA9\xF4\x6F\x32\xE0\x23\xBD\xA7\x71\x27\x01\x37\xAB\x7C", "\x7D\xEB\x95\xD4\x0F\x4F\xE0\x96\x7D\xEF\xDF\x4C\x0F\x73\x6C\x3B\x74\xC3\x64\xA9\x62\x3C\xAB\x28\x67\x2E\xAC\x97\xAB\xE1\x20\x1B\xE0\xD0\x76\xD1\xDF\x5E\x0F\xE9\xD2\x79\xE0\x2F\xAC\xF5\x1E\x14\xAC\x03\xE0\xFB\xAB\xB7\xAB\xDF\x03\xD9\xDF\x62\x71\x80\x5C\xE5\xAB\x65\x00\x68\xE0\xA8\xA6\xBA\xA6\x47\xA6\xE1\xDF\x6B\xE0\xAF\x83\x12\x05\x73\xE0\xE2\xD0\xC4\xBE\xD4\x2B\x90\xD5\x8D\x63\x64\x08\xA3\x66\x97\xE0\x07\xBF\x6E\x68\x92\x66\xA3\xDC\xE4\xDF\xFC\x72\xA2\xE0\xF7\xD3\xD3\x95\xC9\xD2\xBF\xD0\x37\xE0\x26\xD1\xBB\x99\xE9\xB0\xF0\xDC\xA3\xD2\xAF\x26\x2B\xD1\xC6\xB4\xDB\x72\x3A\xD1\xA5\x6F\x0F\xD1\xB0\xE0\x8A\xDF\x8F\xD2\xB3\x08\x38\xD1\x0B\x6F\xB8\xE0\x4C\xD3\x9B\x10\x64\x08\x8F\xA5\x8B\xBC\x71\x6D\x28\xE0\x0A\x82\x10\xB1\x41\x8E\xBD\x6F\x11\xA7\x00\x00\xC8\xE0\xF0\x80\xCA\xE0\x31\x7D\x5E\x6B\x27\x01\xCF\xE0\xD2\xCF\xCB\x7B\x00\x09\x62\xA6\xF2\xB0\xF6\x2A\x5F\xA6\xCC\x74\x21\x09\xD5\xA5\x25\x47\xC8\x03\xA6\xE0\x2F\xDD\xCE\x06\x9A\xE0\x3B\xAC\x50\x9C\x09\x00\xE5\xE0\x33\xAB\x50\x9C\x47\xE0\x81\xDC\xA7\xE0\x85\x04\xE9\xE0\x89\xDC\xFC\xD0\xDD\x01\xF0\xE0\xA9\xE0\xFF\xD0\x4D\xDE\x52\xBD\x06\x01\x82\xD1\xB1\xCC\x82\xA6\x4E\x7C\x24\xA6\x56\xD1\x84\xD1\x6A\xD1\x08\xA7\x96\xE0\xAD\xE0\x8D\x63\x8E\x7C\xE0\x99\xFA\xE0\xE2\xCC\x1E\xA7\x86\xD1\xAA\x8A\xB8\xA6\x22\xA7\xBA\xA6\xB6\x5C\x82\x6B\xEE\xE0\xE5\x03\xF4\xE0\x64\xB1\xF7\xA4\x0D\x00\x14\xE1\x6C\x7B\x44\x0F\x92\x7D\x0E\x00\x18\xE1\x3D\xD3\x97\xBF\xFD\xDE\xD9\x71\xBD\x72\x6D\x04\x63\x65\x14\x2E\x5A\xDA\xDA\xD5\x5F\xC8\x68\x0E\x92\x31\x2A\xBF\xED\xBB\x16\x65\x30\x07\xAC\x7D\xF5\xE0\x9B\xE0\x19\x81\x11\x00\xF4\xE0\x61\xBE\xEB\x0E\x60\xE0\x19\x84\x82\x73\xFD\xD4\x32\x00\x92\xE0\x91\x93\xCA\x67\x37\xE1\x06\x01\x62\x00\x0C\xBE\x41\xE1\xB9\x75\xF9\xCB\xCB\x0B\x3F\x3A\x4C\x8A\x89\xBE\xEA\x02\x73\x6C\x70\x0F\x01\x0B\x4A\xCF\x51\xBE\x1E\xCC\x81\x8B\x8C\xD1\xDA\x7A\x33\xE1\x69\x6B\x36\xBE\x36\xE1\x1C\x75\xCA\x78\x39\xE1\x7C\x75\x3C\xE1\x5B\x94\x3E\xE1\x1C\x75\x43\xE1\x80\xD1\xE3\x4A\x7C\x75\x45\xE1\xC0\x08\x47\xE1\xA9\x8B\x49\xE1\xD1\x01\x4B\xE1\x0D\x6C\x4E\xE1\x1D\xCC\x6E\x06\xE8\x8A\xA9\xE0\xBD\x6B\x09\x01\xA3\xBE\xC8\xB0\x73\x6F\xD8\x6E\xDF\x6E\x7E\x12\xE1\x6E\x13\xD1\x21\x01\xE3\xD0\xAF\xE0\x45\xE0\x9E\xBE\x58\xE0\xFB\x95\x8E\x16\xB5\xE0\xC7\xCB\xB7\xE0\x0D\xD1\xB9\xE0\xF2\xD0\xBB\x99\xD3\x6E\xCA\x9F\x36\xD3\x32\x02\xBF\xE0\x85\xE1\xFA\xD0\x00\xD1\x44\x0F\x64\x08\xD2\x72\xC7\xBE\x84\xD9\x03\xBA\xC6\xBE\x1B\xDF\xE2\xA6\x6A\x2F\x3A\xDF\xD3\xB3\xAC\xDE\xD1\xDA\xAE\xDE\x93\xDF\x4D\xDC\x95\xDF\x4F\xDC\x97\xDF\xD7\xDD\xEB\xC8\xE4\xDC\x0E\xD4\x98\xCD\x67\xD3\x0C\xC9\x8C\xB1\xFA\xC5\x72\xCC\xE4\xBE\xCE\xDC\xC2\xDF\xFB\x69\x98\xE1\x52\xDF\x5E\x2F\x9B\xE1\x7B\xDD\xE5\xD5\xEE\xDE\x21\xDF\x64\xDC\x23\xDF\x66\xDC\xB6\xDD\x68\xDC\xB8\xDD\xA8\xDB\xBA\xDD\xDA\xDB\xC3\xDC\x75\xCC\x3F\xA8\xA9\xE1\x85\xD3\x2D\xD7\xAF\xCF\xBA\xD9\x8D\xCC\xBC\xD9\xA3\xE0\xEC\xDC\x09\xBF\xC4\xB6\xB4\xE1\xB2\xE0\x9A\xE1\xC0\x56\x9C\xE1\x7C\xCC\xC5\xCA\x74\xDF\xBF\xDA\x76\xDF\xC1\xDA\x73\xD9\xC3\xDA\xCA\xD4\xC5\xDA\x7A\xD5\xCB\xDE\xD3\xD9\xA2\xD3\x04\xA0\xA7\xCC\xBD\xCF\xD8\xB1\xB0\xD3\x54\xC7\xD3\xE1\x33\xDD\xAC\x56\xD6\xE1\xB8\xE1\xB6\xD7\x0A\xDC\xEF\xDE\x2D\xDC\x09\xDF\x90\xB2\x0B\xDF\x9D\xB4\xDF\xE1\xEE\xD5\xE1\xE1\xD6\xD5\x75\xDA\x3F\x0F\x2A\xDD\x23\x0C\x3C\xC9\x79\xDA\x76\xAD\xE3\xE0\x51\x9C\x0E\x93\xEC\xE1\x47\xDD\xEE\xE1\x22\x59\xD7\xE1\x05\xCD\xEC\xDD\x1F\xDA\xEE\xDD\x45\xD5\xF0\xDD\x34\xCD\xF2\xDD\xB9\xDD\x29\xDF\xBB\xDD\x2B\xDF\xE5\x6C\xFB\xD6\xB4\xDA\x03\x01\x07\xE2\x5E\xDD\x54\x28\xB7\xE1\x95\xDD\x8F\xDF\x8C\xD9\x95\xDE\xB5\xDD\x97\xDE\xBC\xDB\xCD\xD9\xE0\xDC\x1A\xDB\xE2\xDC\xF7\xD9\x76\x9D\x8C\xC6\xFB\xCC\x2C\xC1\x1C\xE2\x79\xDD\x09\xE2\xB6\x9E\xBE\xDE\xE9\xDD\xB6\xD3\xD8\xDE\x9F\xE1\xDA\xDE\x3F\xDF\xAD\xD8\x41\xDF\x53\xDA\x43\xDF\xB1\xD8\xA7\xE1\x96\xD9\x2A\xD7\x85\xD6\x2C\xD7\xAB\xE1\xCE\xB5\x72\xDD\x5B\xB2\x67\xC3\x83\xB9\x30\xE2\x93\xDD\x32\xE2\x2A\x9F\x52\xDE\x6A\xDE\xCD\xDD\x37\xE2\x91\xDF\xA0\xE1\x3A\xE2\x51\xDA\x3C\xE2\x83\xDD\x3E\xE2\xFD\xD8\x45\xDF\x91\xDA\x2B\xD4\x3F\xCD\x8A\xDD\x64\xDF\x8C\xDD\xB1\xDA\x8F\xDD\xEF\xD7\x09\x01\x4B\xE2\xAC\xDD\x1E\xE2\xEF\xE1\x20\xE2\x4D\xDB\x73\xDF\x4F\xDB\xF5\xE1\x43\xB3\xF7", "\xE1\x21\xB7\xF9\xE1\xC0\xD6\xFB\xE1\xF0\xD5\x28\xDD\xA3\xDD\x49\xD4\x08\xD0\x4D\xDF\x4C\xD4\x19\xDF\x02\x01\x66\xE2\xC9\xDD\x4D\xE2\x7B\x9F\x4F\xE2\x75\xD7\x6B\xDE\x81\xDE\x6D\xDE\x57\xDE\xC0\xDA\x25\xCF\xC2\xDA\x61\xD6\xD4\xD5\x74\xE2\x12\xD6\x51\xA2\x92\xDA\xC0\xDD\xE1\xC9\x5B\xDA\x6D\xA8\x97\xDA\xB1\xDA\x8B\xD7\x76\xDD\x1B\xE2\xBC\xE0\x5F\x2F\x33\xE2\x70\xDF\x4C\xDB\xED\xDE\x52\xE2\xA1\xDA\xDB\xD4\xA3\xDA\xDD\xD4\x88\xD8\xDF\xD4\x59\xE2\x3C\xDA\x5B\xE2\x87\xDD\x85\xD4\xD4\x4E\x87\xD4\x8B\xDD\x89\xD4\xDF\xDD\xFB\xDE\xE1\xDD\xAE\xD7\x06\x01\x7E\xE2\xE5\xDD\xB6\xE1\x69\xE2\xCB\xDD\x94\xD8\x51\xE2\x07\xDF\xDF\xAD\x6E\xE2\xA6\xB3\x70\xE2\x55\xD9\x72\xE2\xF6\xD6\x8D\xE2\xC2\xD6\xA2\xDD\xF8\xDD\x65\xCE\xB5\xE2\x50\xDE\x80\xE2\xDC\x9E\xB9\xE2\x60\xDC\xEA\xDD\xEF\xC9\x1D\xDA\xB4\xDD\x99\xDD\xBF\xE1\xBE\xDC\x27\xE2\xF3\xDD\xE1\xDC\xF5\xDD\x2B\xE2\xB8\x9D\x0B\xDE\x64\xDE\x65\xE2\x9A\xE2\x1F\xE2\xCD\xE2\x27\xDE\xA8\xD8\x90\xDF\xA1\xE2\xD4\xD6\x55\xE2\xDC\xDE\x57\xE2\xDE\xDE\xA7\xE2\x55\xDA\xA9\xE2\x52\xC7\xF1\x8E\x97\xE1\xDF\xE2\xB8\xE2\x82\xE2\x69\xD9\xCF\xE2\xA8\xCD\xCF\xDD\x66\xDD\xF2\xDE\x68\xDD\xF4\xDE\x6A\xDD\xF6\xDE\x6C\xDD\x01\xD8\x64\xD0\x78\xD8\xF4\xD5\x64\xCA\x07\xDB\x93\xC0\xDE\xE2\x99\xE1\xCF\xD2\xE0\xE2\xF3\xE2\x08\xDC\xF5\xE2\x2D\xD9\xF3\xE1\x2B\xDE\xF1\xDE\x98\xCB\xD2\xDD\x98\xDE\xB1\xDE\x9A\xDE\xA5\xE1\x9C\xDE\xEA\x8A\x01\xD5\xE3\x8F\x94\x92\xC9\xE2\x90\xDE\x68\xE2\x0A\xE2\xF0\xE1\x81\xD8\xA0\xE2\x3A\xDD\x3E\xD6\xE7\xE2\x94\xDF\xE9\xE2\x96\xDF\xEB\xE2\x85\xDD\xED\xE2\x6E\xDB\x9B\xDF\xB5\xD8\x31\xDB\x80\x08\x06\xE2\xF1\xE2\x1F\xE3\x6A\xE2\x9F\xE2\xBC\xE2\xA7\xB0\xBE\xE2\x3F\xB5\xC0\xE2\x3F\xDB\x79\xDF\xD9\xCC\x7B\xDF\x36\xDE\x17\xC1\x38\xD5\xA8\xA9\x0F\xB9\x1C\xE3\xE9\xDE\xCB\xE2\xCC\x9F\xE1\xE2\xAB\xDE\x49\xDC\xD9\xDE\x4B\xDC\xA1\xE1\x81\xDD\x27\xE3\xA4\xE1\x29\xE3\xB4\xDE\x2B\xE3\x37\xD5\x5F\xD8\xBC\xCA\xEB\xE1\x32\xE3\x9C\xE2\x04\xDF\xF4\xDC\x6B\xE2\x85\xE2\xDA\xE1\x6E\xDE\x88\xE2\x59\xDE\x71\xDE\xFC\xDC\x9D\xD8\xFE\xDC\x9F\xD8\x37\xDE\xD8\xB4\x43\x95\x72\xDB\xE2\xDD\x71\x6D\x44\xE3\x0D\xE0\xFC\x87\xF2\xE2\xEB\xDE\x8E\xDF\x5C\xE3\x43\xDE\x82\xDE\x79\xD7\x84\xDE\x7B\xD7\x86\xDE\x7D\xD7\x88\xDE\x9F\xD6\x8A\xDE\x92\xAF\xDA\xC4\x6E\xB7\xC8\xE2\x58\xE3\x4E\xE2\x71\xE3\x37\xD8\x21\xE2\xC8\xD9\x4B\xE3\x7F\xDD\x4D\xE3\xB0\xDE\xA3\xE1\xB2\xDE\x51\xE3\xE0\xDE\x53\xE3\x30\xBE\xE6\xDF\x99\xDB\x15\xD3\x9B\xDB\x00\x00\x6D\xE3\x6C\xDF\xD2\xDE\x09\xE3\x84\xE3\xEA\xD9\x73\xE3\xE4\xE2\x23\xE3\xF7\xD8\x03\xDE\xF9\xD8\xA5\xE2\xFB\xD8\x8E\xE3\x98\xDF\x90\xE3\x63\xD0\xFA\xDE\x52\xB3\xE5\xDE\xD1\xAF\x1B\xE3\x82\xE3\x81\xE2\x9B\xE3\x1A\xDA\x35\xE3\x6C\xE2\xC2\xDE\xFB\xDA\xF0\xD9\x3A\xE3\x91\xDB\x3C\xE3\x13\xCD\xC9\xDE\x8D\xCA\x67\xC7\x2E\xD8\xC0\xD5\xC9\xCE\x99\xE2\x07\xE3\x6D\xDF\x9B\xE2\x83\xE3\x34\xE2\x7F\xDE\x76\xD7\xB3\xE3\x08\xDF\xB5\xE3\xC4\xDE\x77\xDF\xDD\xD8\xC2\xE2\x0F\xD7\xC4\xE2\xF8\xD6\x37\xDC\xE4\xD8\x4C\xCB\x44\xC8\xDE\xB7\x02\xE2\xB8\xC8\xDF\xCE\x20\xE1\xB1\xDF\xCC\x69\x97\xE3\x8D\xD2\xC3\xE3\x9A\xE3\xC6\xE3\xD6\xDE\xF8\xDA\xC9\xE3\xBD\xE2\xCB\xE3\x0A\xDF\xCD\xE3\xB0\xD9\xCF\xE3\xDF\xD8\xD1\xE3\x11\xD7\x26\xB0\xD4\xE3\x34\xB8\x60\xC8\xFA\xD5\x59\xDC\x41\xD9\xFF\x00\x34\xDF\x4D\xD4\x06\xE3\xB5\xE1\x6F\xE3\x33\xE3\x48\xE3\xE5\xD3\x13\xDE\x11\xDB\x15\xDE\xBD\xE1\x17\xDE\x2E\xDE\xBB\xD6\x30\xDE\x68\xCF\x32\xDE\xF1\xCC\x34\xDE\xAA\xDB\xDB\xDB\x4E\xCF\x54\xDC\x50\xCF\xA2\xCD\x98\x09\x8C\xCB\x67\xDF\x1B\xD6\x3F\xDC\xA9\x67\xDE\xE3\xCE\xD2\xE0\xE3\x70\xE3\xE2\xE3\x05\xDF\xE4\xE3\x5D\xE3\x6D\xE2\xE7\xE3\xF6\xE1\xE9\xE3\xFE\xDA\xEB\xE3\x57\xD9\xED\xE3\x1A\xD9\xD3\xE3\x0E\xE4\x8D\xD0\xAF\xDA\x9C\xC8\x9D\xD0\xD8\xE3\x6E\xD0\x35\xCF\xC7\xDB\x01\x01\x17\xE4\xA9\xD2\x08\xE3\x1A\xE4\x9D\xE2\xB0\xDD\x86\xE3\x3C\xDF\xE5\xE2\xAB\xD8\x25\xE3\xA2\xE1\x4F\xE3\x8D\xE3\xBF\xD3\xBB\xD5\xC1\xD3\x4A\xCB\x8C\xD0\x79\xD8\xD1\xD1\x58\xDC\x40\xD9\xFC\xD5\xB7\xC5\x87\xDF\xE1\x97\xE6\x65\x33\xE4\xA2\xD2\xD5\xE1\xFC\xE3\x0A\xE3\xCC\xDD\x0C\xE3\x6B\xD9\x00\xE4\x22\xDF\x10\xE3\xEB\xD3\x12\xE3\x26\xE2\x99\xDE\x28\xE2\x9B\xDE\x2A\xE2\x9D\xDE\xA8\xE3\x01\xE3\x31\xD4\x9D\xDF\xA3\xDF\x75\xCF\xA0\xDF\x77\xCF\xB6\xD0\x79\xCF\xB8\xD0\x58\x9B\xC2\xE0\x48\x0F\xD3", "\x95\x65\xD2\x34\xB1\x11\x7C\x16\x00\x77\xE0\x21\xD5\x10\x64\x66\xB9\x59\x6F\x16\x65\x70\x0F\x31\xE0\x1C\x75\x7C\xE4\xD6\xD2\xCC\xDA\x30\x51\x77\xE4\x5A\xB3\x8F\x25\x2F\x09\x7E\xE4\x6E\xC3\x8F\x25\x78\x6B\x60\x0D\xDE\x36\x5C\x81\x46\x47\x8C\xDC\xEE\xBB\x51\xBD\xED\xA4\x5C\x0A\xFE\xD0\x12\xD1\x08\xD1\x06\xCC\xD1\xD1\x17\xC2\x26\xBC\x8B\xAC\x34\x86\xA5\xBC\xD3\xAC\x03\x01\x93\xE4\x1D\x65\x87\x6F\x82\xAB\x81\xC2\x02\x01\x9F\xE4\x1C\x65\x87\x6F\xB0\xBC\x64\xBD\x85\xBD\x76\xDA\x17\xBC\xB6\xBC\xEC\xAB\x2B\xC2\xA3\xE4\x01\x01\xA5\xE4\xC3\x9B\x95\xE4\xF7\x02\xF3\xBC\xBB\x90\xC0\xBC\x87\xC2\xA0\xBD\x62\xE0\x7F\xBD\xB3\x66\xB4\x9E\x0C\xD1\x3B\x09\x20\x70\x7A\xBD\xCB\xBD\x8D\xAC\xEF\xBC\x42\xC2\x6C\xC2\x37\xA7\x92\xE4\xBE\xE4\x6B\x6F\xB5\xE4\x82\xBD\x2D\x71\x3A\xBC\xAA\xE4\x6A\xD7\xA4\xAC\x7C\xBD\xA0\xBD\xD3\xBC\xB6\xCF\x27\x01\xB2\xE4\x32\xD3\xBF\xE4\x79\x8E\x0B\xBD\x34\x72\x84\xBD\x35\xA5\xF6\xCF\xAC\xE4\xE3\xBC\x1C\xA5\x8F\xAC\xC7\x90\xD8\xE4\x65\xE0\x81\xE1\x72\x6F\x9B\xBD\xD9\xAB\x53\xA5\x3F\xC2\xAD\xE4\x0B\xBC\x71\x0F\x60\xC2\xBC\xE4\x9E\xE4\xCA\xE4\x3A\x6F\x43\x0A\xB6\xE4\x80\x08\x67\xC2\xB3\xBC\xEA\xD2\x67\xBD\x6A\xC2\xED\xAB\xB0\xE4\x00\x00\xE6\xE4\xF3\xD2\x91\x6F\xE9\xE4\x30\xC2\x06\x91\x62\xBC\xC3\xE4\x54\xC2\xC5\xE4\xF9\xBC\xE5\xE4\xF4\xE4\xDC\x6E\x6B\xBC\x78\xA5\xFA\xE4\x7B\xBC\x99\xE4\xE5\x8E\xC3\xBD\xC7\xE4\x80\xD2\xCC\x69\x01\xE5\x18\xD3\xB4\xE4\xC0\xE4\x4F\xC2\x21\x91\xCA\xBD\x68\xC2\xCC\xBD\x03\xBD\xB5\x70\x89\xC2\xC6\xE0\xFB\x69\x19\xE5\x97\x9C\x7A\xE1\xCA\xAC\x20\xE0\x62\xD1\xC9\xE4\x80\xE1\xDA\xE4\x52\x6E\x1E\xBD\xCD\xE0\x27\xE5\x06\x9D\x29\xE5\x2B\x75\xBC\xB7\xE2\xBD\x18\xE5\x0D\xE5\x92\x6F\xE6\xBD\xD0\x74\x33\xAC\x0D\x8F\x13\xE5\x15\xBC\x6E\xE4\xAC\xD6\x4E\x8E\xA4\xA5\x32\x40\x9A\xE2\xBC\x26\x4D\x75\x8E\xE0\xFB\xA3\x0D\x2B\x75\xAB\x05\xA0\x58\xBD\xE3\xAC\x9C\xE4\xF8\xE0\x28\x4A\x47\xE5\xA4\x23\x49\xE5\xF9\xAB\x89\xE0\xF4\xDF\x5E\xBD\x16\x6E\xE6\x65\x1B\xD1\x31\xE2\xB0\x45\xB3\x08\x56\xE5\x07\xAC\xD8\xA3\x4B\xA4\xA8\xE4\xB2\xBC\x52\xC2\x76\xA0\x87\xBD\xFD\xE4\xAF\xE4\x16\xE5\x7A\xAC\x5C\x0A\x5D\xE5\x4C\xE2\x5F\xE5\x78\x08\x61\xE5\x16\xA2\x4B\xE5\x6B\x38\xF7\xE4\x9B\xAB\x11\xE5\x02\xBD\x40\xE5\xAB\x8D\xBB\xE4\x1D\x65\x71\xD0\x6F\xE5\x67\xE2\x0E\xE0\x60\xE5\x77\x76\x4A\xE5\xB4\xA3\x58\xA3\x20\xBC\x0B\x47\x22\xBC\x79\xE5\x69\xC2\x22\xE5\xC8\x69\xD1\xAB\x7F\xE5\x54\xE5\xB4\xE0\x84\xE5\x57\xE5\x20\xA4\xF7\xDF\x64\xE5\xCD\xE4\x46\x6F\xCF\xE4\xDF\xE4\xAB\xE4\xD2\xE4\x9F\xBD\x93\xBD\x8E\x10\xD5\xE4\x1C\x65\x90\xE5\xC2\xE3\xD2\xDE\x48\xE5\x93\xE5\x62\xE5\x75\xA4\x0D\x2B\xB0\xBC\x51\xC2\x5C\xC2\x68\xE5\xFC\xE4\x8D\xE5\x54\xA0\x6A\xBD\x87\xD0\xCC\x69\x80\xE5\x7F\xE2\x71\xE5\x85\x07\x73\xE5\xDA\xA2\x75\xE5\x4A\x33\xD8\xAB\x1D\xC0\xDA\xAB\x08\xE5\x5E\xC2\x0A\xE5\xF0\xE4\x10\x72\xA3\xE5\xFA\xE3\xAA\xD2\x92\xE5\xFC\x16\x85\xE5\x63\xE5\x50\x41\xF7\xE4\x56\xBC\xC0\xE5\x69\xE5\xB0\xE5\x6B\xC2\xB2\xE5\x50\x67\x6E\xE5\x91\xE5\x83\xE5\xC9\xE5\x94\xE5\xC4\xA4\x89\x3B\xF7\xE4\x74\xA0\x67\xE5\x83\xA0\xE1\xE4\xAB\xBD\xB8\xBD\xC4\xE5\xA9\x67\xB5\xE5\xB6\xE2\xB3\xE0\xD7\xE5\xCE\x6B\xCA\xE5\xA9\xE5\x76\xE5\x0F\xE5\x00\xBD\x8B\xE5\x21\xE5\x7B\xE5\xB1\xAC\x05\xBD\xA2\xE5\xE4\xE5\xD6\xE5\x72\xE5\xA7\xE5\x74\xE5\x86\xE5\x97\xE5\x1D\xE5\xB8\x0E\x79\xBC\xEF\xE5\xC4\xE4\x73\xBD\x8B\xA5\x95\xA0\x91\xE4\x46\xE5\xA4\xE5\x38\xDF\xC8\xE5\xE9\xE5\xD9\xE5\x21\xA4\x4B\xA4\x2A\xE5\x7F\xE4\x91\xC9\xD5\xE5\x06\xE6\x40\x38\x08\xE6\x03\x01\x1A\x66\xA8\xE5\xFA\xAB\x01\xE0\x31\xE5\xBB\x99\xE5\xE5\xCA\xE2\xB7\xE5\x22\x08\xB9\xE5\x9C\xA4\xBB\xE5\x4E\x33\xA1\xA5\x37\xE5\xE7\xA6\x71\x6D\x1B\xE6\x1D\xE3\x82\xE5\xF7\xE5\xD8\xE5\x16\xE6\x58\xE5\xF3\x40\x31\xAC\x3D\xE5\xE8\xBD\x9F\x72\xEA\xBD\x3B\xD1\x8D\xD1\x2F\x04\x34\xE1\x7A\x0F\x2C\x73\x3F\xE1\x98\x28\x53\xD1\x29\x94\x5E\x00\x62\x71\x7B\xD1\x4A\x01\x78\x6B\xE2\x0B\x8A\x5E\x27\xB1\x08\x50\x56\x0B\xBE\x66\x3A\xE6\x98\x33\x0C\xBE\x18\x00\x73\x6C\x40\xE6\x20\x01\x42\xE6\x6B\x0A\x44\xE6\x0D\x6C\xE1\x07\x22\x63\xA8\x03\xAC\x66\x04\x00\x49\xE6\x62\x06\x0C\xBE\x58\xE6\x11\xE6\x8D\x17\x2B\x04\x50\xE6\x82\x11\x52\xE6\x43\xDC\xCA\x14\xCD\xB0\x52\xE1\x19\x81\x19\x00\x34\xE1\x56\xE1\x06\x01\xE9\xA6\xC9\xB0\x6B\xE6\x1F\xBE\xFF", "\x42\x70\xAE\x9B\x3B\x60\xE6\xD7\x11\x62\xE6\x18\xE0\x50\xA6\x50\x4A\xAC\x66\x92\x7C\x40\x10\xAB\x7B\x82\x73\x87\x94\x77\xDC\x42\xA6\x91\x07\x73\xE6\x66\x13\x75\xE6\x2A\xE4\x24\xD1\x19\x81\x8D\x25\xC8\xB0\x7E\xDA\x62\x34\x80\x51\xFB\xD1\x80\x51\x80\xE0\x48\x5B\x59\xE6\x00\x00\x1B\x00\x52\xD2\x8A\xE6\x81\xE4\xF2\x3B\x8D\xE6\xF2\x3B\x2F\x09\x93\xE6\x63\xAF\x80\x51\x82\xE6\x4E\x63\xFC\x57\x5F\x45\x38\xD2\xC4\x49\x30\xE1\x4F\xBD\xDA\x7A\x1D\x00\x75\xE4\x58\xAA\xEB\x57\xC5\xDF\xD3\xDF\x60\xD2\xEA\xD1\x6A\xE6\x03\x01\x99\xD1\xCB\x7D\x83\xE0\xFC\xB0\xCB\x63\xAE\xDC\x4C\x5F\x33\x9B\x09\xA6\xCF\x91\x5C\xE1\xAD\xD3\x72\xD3\xAC\x66\xA3\x1D\x34\xA7\x5A\xD2\x0E\xE6\x5C\xD2\xAA\xE6\x4B\xD3\xAC\xE6\xCF\x91\x2F\x09\xC1\xE6\xBF\x93\x11\x93\x4D\xB1\x7F\x08\x40\x55\x5F\xD2\xCF\x91\x87\xE1\x3C\x0F\x18\x88\xC9\xE6\x2C\xE1\xA6\xE6\xA8\xE6\x06\xB4\xC4\xE6\xFD\x7C\x33\x66\xAF\xE6\x02\x01\xB1\xE6\x28\xBE\xB3\xE6\xA9\xE6\xCC\x63\xCF\xE6\x11\x93\xA3\xD1\x62\x71\x8B\x34\xBB\xE6\x61\x45\xBE\xE6\x50\xD2\x94\xE6\x5D\xB1\xD9\xE6\xE3\xE6\x6D\x92\xC8\xE6\x73\x6C\x8B\x34\xCC\xE6\x5F\x09\xCE\xE6\x17\x6F\xD0\xE6\x66\xE6\xA6\x80\x1E\x00\x34\xE1\x7A\xE4\x27\x01\xDE\xE6\x62\xD1\xA4\xD1\xAA\x7D\x05\x9B\x5C\xDC\x4C\x6F\xC4\x49\xE8\xE6\xF0\x99\x97\xE0\x34\xE0\x06\x01\xBF\xD1\x3F\x75\x5E\x92\x08\x60\xFD\x7C\x66\x5F\x56\xD2\xE3\x70\x75\xE0\x01\x01\x1F\x00\xFC\xE6\x50\xE0\xDD\xE6\x9A\xD1\x3C\xE6\x10\x73\x01\xE7\xED\xE1\x53\xDF\x5F\x49\x6B\x68\x62\x9A\xF9\xE6\xE7\x7D\x20\x00\xD7\xE6\x1F\x65\x47\x63\x37\x3B\xAE\xDC\x96\x6F\x1C\x33\x8F\xE6\xD2\x5E\x1C\x75\x28\xD3\x35\x65\x28\xE7\x1C\x33\x2A\xE7\xE1\x63\xDB\x60\x72\x00\xC8\xE6\xB4\xE6\x16\x2A\x2A\x45\x9F\xD2\xCC\xD2\xAC\xD3\xA1\xE4\x23\xE7\x11\x7C\x21\x00\x26\xE7\x08\xAF\xE7\x04\xFD\x63\x0F\xD2\xBE\x5A\x5A\x06\x2D\xE7\x00\x00\x22\x00\x91\xE6\x4C\xE7\x2B\xE5\xC4\xDC\x8C\x0E\x52\x4E\x74\xDC\xCF\x5A\x80\x51\x2F\x09\x4E\xE7\x4B\x95\xD0\x01\x48\xE7\x54\x01\x9E\xE6\x8E\xD2\xA0\xE6\x26\x3F\x16\xD7\x8C\x0E\xC4\xDF\xC5\xE6\xE4\xCB\xDA\x7A\x23\x00\x17\xE7\x44\x0F\x70\x0F\x26\x99\x40\x10\x8B\x96\x82\x73\x9C\xDC\x24\xE0\x44\xDC\x8C\x01\x78\x6B\x0B\x09\xDF\x25\x77\xB0\x77\xAE\x69\x24\x10\xE0\x19\x81\x66\xE7\x0D\xE7\x70\xE5\xD7\x11\x79\x4E\xB0\xDF\xE9\xE6\xFD\xE6\xF9\xB0\x34\xA7\x8B\x96\xE9\xD2\xE2\x0B\x7E\xE7\x0E\xDD\xBC\xE6\x28\xD9\x2F\x09\x6E\xE7\xE3\xD9\x28\xD9\x72\xE7\xA5\x09\x74\xE7\xC6\xD2\xB4\x06\xFF\x6F\x2B\x69\x7E\x6F\x77\x37\x7A\xDC\x71\x0F\x8B\x96\x46\xD2\xBE\x70\x5E\xE5\x7D\xE7\x63\x3E\xAB\xE6\x89\xE7\x02\xDA\xFD\x7C\xA0\xBE\x79\xE7\x67\xE7\x9B\x10\x69\xE7\xBE\x70\x6C\xE7\xAC\x72\x8C\xE7\xA1\xE7\x70\xE7\x24\x6F\xB7\xDA\xCB\x0B\xDF\x07\x75\xE7\x5D\x96\x78\xE7\xA6\x80\x7A\xE7\x89\xE6\x7C\xE7\x66\x13\x87\xE7\x12\xE7\x6F\xE7\x26\xDC\x4A\xE7\x6A\xE7\xB6\x9B\xFE\xDF\x1C\xE6\x9E\xE7\x5E\x49\x63\xE7\x61\x45\x8B\xE7\x7D\xD8\x8F\xE7\x41\x0D\x91\xE7\xED\xD2\x86\x01\x13\xE7\x16\x65\x9A\xE7\x43\xE7\x08\xE2\x82\x11\xBB\xE7\x99\xD2\xBD\xE7\xB2\xDB\xD6\xE7\xE8\xCB\x11\x7C\x26\x00\xD2\xE7\xF6\xAF\x97\xB0\x17\x64\x9D\x64\x25\xDC\xB2\xDB\xE4\xD2\x81\xE7\x1D\x76\xBE\x70\x86\xE4\x17\xE5\x03\xA0\x6A\x60\x7F\x64\xE2\xE7\x10\xD2\xD6\x01\x85\xE4\xE6\xD6\xD6\x01\x89\xE4\x9B\x12\x72\x0D\x8C\xE4\x1A\x5B\xB5\xE7\xE7\x7D\x27\x00\xDD\xE7\x78\x83\xE7\x42\x66\x64\x8B\xD1\xDF\xE3\xA5\xE5\xA4\x23\x4A\xE7\xF5\x00\x82\xE0\x4F\xE7\x76\xD2\x4F\x08\xFE\xE7\xE1\xE7\x00\xE8\x07\xE6\xB3\x08\x8D\xE0\x5D\xE6\xD0\xD2\x5E\x01\xBB\xE6\x0C\xA7\x0E\x7D\x40\xE7\x75\x85\xBA\x4F\xB8\xE7\x65\xB4\xBA\x08\x6E\x64\x69\xAB\xFD\xB0\x12\x6F\xE5\xE7\x81\xE0\x1C\x75\xDA\xDF\xE9\xD2\x6D\x64\xBC\x5B\x02\xE1\xEC\xE7\x5A\xB3\xBE\x3E\x0E\xE8\x06\xBA\xBE\x3E\x12\xE8\xDF\xDF\x28\xA6\x8E\xE4\xD8\xD9\x09\x01\x29\x00\x1D\xE1\x67\x7D\x96\xE1\x54\xC7\x9F\x5F\xB9\xE6\x46\x94\x20\xE3\x33\xDA\x74\xE3\x86\xE2\x83\xDE\x6F\xDE\xFA\xDC\x62\xE3\x49\xDE\x64\xE3\x4B\xDE\x67\x91\xB5\xD9\x20\xAD\xC7\xDC\xCC\xAD\x69\xA7\xF9\xC5\xE9\xDC\xF4\xC8\xA0\xB8\xD8\xCF\x90\xDD\x01\x01\x38\xE8\x06\xBD\xC0\x93\x53\xE4\xBA\xE2\x55\xE4\xF2\xE1\xBB\xE1\x1D\xDD\x59\xE4\xB9\xD6\x5B\xE4\xB7\xDD\xD6\xE2\x14\xE2\xD8\xE2\x2A\xDF\xE3\xDC\x41\xE2\x3F\xDA\x99\xD9\x87\xD6\x63\x92\x87\xD3\x9D\xD9\x13\xD7\x16\x05\xBF\xD9\x37\xE8\x4D", "\x95\xB0\xE3\x53\xDE\xC8\xE3\x1E\xE4\xB4\xE3\x75\xDF\xB6\xE3\x22\xE4\xF3\xDB\x24\xE4\x75\xD9\x74\xDE\x2A\xCF\xE3\xE1\xF6\xC2\xD4\xD9\x04\xDD\x2E\xE4\xFA\xC2\x12\xDD\x94\x92\x53\xE8\x78\x91\x3A\xE8\x34\xE3\x63\xDD\x22\xE3\x44\xDE\x36\xDA\xA1\xE3\x38\xDA\xA3\xE3\x3A\xDA\xA5\xE3\xA6\xE1\x43\xE4\xB3\x92\xF9\xD9\xC4\xCC\xF0\xB8\xFC\xD9\x04\xE2\x5E\xA1\xF1\x90\x5C\x0A\x86\xE8\xA6\x91\x88\xE8\xFD\xE3\x66\xD8\x89\xDB\x5A\xE8\xF0\xDE\x38\xE3\x09\xB8\xB7\xE3\xD6\xDB\xB9\xE3\x39\xCD\x3E\xE3\x0C\xE4\x70\x76\x19\xE2\x79\xDE\x09\x01\x9E\xE8\xF8\x91\xA0\xE8\x56\xE8\xCE\xE2\x36\xE2\x36\xE3\xCC\xB2\xA6\xE8\x0F\xBA\xA8\xE8\x12\xDC\xAA\xE8\x94\xCD\x7C\xE8\x64\xD6\xFD\xE1\xBD\xD9\x2C\xDA\x50\xE8\x64\xE2\xC9\x3C\x70\xE8\x1B\xE4\x5B\xE3\xB2\xE3\x74\xE8\xCA\xE3\x76\xE8\xCC\xE3\xDD\xE1\x78\xDF\x7A\xE8\xB2\xD9\xC0\xE8\x09\x8D\x6E\xDD\xAD\xCF\xCA\xE1\x43\xDA\x7C\xD5\x32\xD7\xFD\xC6\x9F\xBC\x9D\xE8\xC8\xE8\x37\xE4\xBF\xDE\xB9\xE1\x8B\xE8\x75\xE3\x85\xD8\x77\xE3\x87\xD8\x05\xDE\xB9\xD5\x41\xE4\x8B\xD8\x94\xE8\x7C\xC3\x90\xE2\x97\x68\xB5\xBF\x27\xE1\x15\xD0\x27\x9D\x4C\xDF\x63\xC8\x60\xDA\xDC\xE8\x50\xE7\x71\x6D\xB2\xE8\x2A\xAC\x55\xE8\x71\xE8\x50\xE2\x58\xE8\x62\xDC\xA4\xE8\xF4\xE1\x20\xE4\x6F\xE2\x78\xE8\x23\xDD\xD2\xE8\x00\xDB\x26\xE4\x39\xD9\xC2\xE8\xAE\xE5\x6B\xD7\xB1\xDA\x7B\xE2\x71\xBB\xC7\xE8\x79\x95\xA4\x95\xC9\xE8\xEC\xDE\x8A\xE8\xB8\xE8\xDE\xB5\xBA\xE8\x64\xBA\x05\xE9\x1B\xDE\x07\xE9\xF5\xDB\x09\xE9\x11\xDA\x03\xDB\x88\xDD\x93\xDA\x4D\xD7\xC4\xDD\x16\xDF\x0A\xD0\xF7\xE8\xC1\xCB\xCC\x69\xFA\xE8\x3B\xA6\xFC\xE8\x14\xE9\x72\xE3\xCB\xE8\x3D\xE8\x5E\xE3\x87\xE2\xDC\xE1\x89\xE2\xDE\xE1\x8B\xE2\x5A\xD8\x1F\xE9\xEE\xDA\x21\xE9\xAB\xE2\x05\x50\xAD\xE2\x60\xE2\xAF\xE2\xB1\xDA\xB2\xE2\x1A\xE2\x02\x01\x2B\xE9\x97\xCF\x2D\xE9\xE0\xE8\x35\xE2\x28\xDE\xE3\xE8\x3E\xE8\x76\xE3\x40\xE8\x47\xDE\x42\xE8\x5B\xDE\x7B\xE3\x7F\xD7\x66\xE3\x11\x78\xC7\xE2\xA4\xDE\x44\xE9\xDF\xE8\x5A\xE3\x15\xE9\x72\xDF\xCC\xE8\xE6\xE3\xCE\xE8\xE8\xE3\xD0\xE8\xCE\xE3\x37\xE9\xC4\xDA\xD4\xE8\xCC\xD4\xE3\x80\xDC\xE2\x6B\xE3\xFB\x69\x45\xE9\x3C\xA5\xE9\xD1\x22\x94\x55\xDF\x0B\xD9\x57\xDF\xD1\xDB\xD9\xD8\x04\xE4\x55\xD8\x06\xE4\x24\xD4\x08\xE4\x62\xD4\x0A\xE4\x6C\xDC\xAD\xE8\x41\x78\xF1\xDA\x5B\xDD\xDE\xE8\x12\xE9\xE2\x93\x48\xE9\xC7\xE3\x84\xE2\x31\xE9\x1F\xE4\x5F\xE9\x21\xE4\x61\xE9\xEA\xE3\x63\xE9\xE0\xE1\x65\xE9\xC6\xDA\xBD\xE3\x7A\xD9\xB6\xD8\xE6\xD4\x33\xD0\xF3\x8A\x80\xE9\x45\x94\x02\x94\x3B\xE8\x38\xDD\x9E\xE3\x8C\xE8\x3B\xDD\xA3\xE2\x3D\xDD\x90\xE8\xA6\xDA\xEA\xE8\xA8\xDA\x06\x7A\xF7\xE0\xC6\xE8\xA0\x5F\x59\xE9\x6F\xE9\xCF\xDB\x71\xE9\x4C\xDD\x59\xDF\x4E\xDD\x5B\xDF\x27\xDF\x9D\xDD\x6B\xDC\xA3\xCB\xBC\xDD\x7D\xD0\x63\xE4\x1A\xC5\x63\xDE\x69\xE9\x2A\xE9\xA8\xE9\xAA\xDE\xFE\xE3\xA3\xE8\x57\xE4\xBC\xE1\x5C\xE8\x53\xD8\x5E\xE8\xC0\xE1\x60\xE8\xC2\xE1\x15\xE2\xC4\xE1\x17\xE2\x48\xE2\x8D\x63\x72\xBA\x0F\xB9\x6B\xE9\x77\xAC\x6D\xE9\x0B\xE2\xEB\xDD\x65\xDD\xDA\xDC\x67\xDD\xD4\xDB\x69\xDD\x71\xD8\x6B\xDD\x37\xD9\xF8\xDE\x5C\xAF\x4B\xD0\x51\xCE\xC4\xB6\xCE\xE9\x6B\xBD\x4E\x91\x82\xE9\x5A\xE9\x2F\xE9\x16\xE9\xE5\xE3\x37\xE3\x03\xE9\xBF\xE2\x1B\xE9\xC6\xDE\x1D\xE9\x25\xDD\x39\xE9\x36\xDC\x90\xE9\x6D\xD0\xC7\xC4\x04\xC1\x7B\xD8\xCD\xE9\xBB\xE9\x69\xDE\x83\xE2\xBB\xE2\xE7\xE9\xB9\xE8\xE9\xE9\x39\xE3\xEB\xE9\x0C\xDF\xED\xE9\x1D\xDE\xEF\xE9\xA1\xDD\xD4\xC0\x7F\xE3\xBC\xBA\x65\xCE\xE0\xE9\xEF\xE6\x7A\x95\x99\xE9\x80\xDE\x86\xE9\x75\xE8\xDB\xE1\x77\xE8\x8A\xE9\x23\xE4\x8C\xE9\xFA\xE1\x8E\xE9\xE2\xE1\xC7\xDA\x3C\x0F\xFF\x7B\x03\x49\x00\x70\xAF\xA3\xCE\xDE\x2C\xC1\x09\xEA\xF7\xE6\xB4\xE8\xFD\xE8\xF9\xE9\xFF\xE8\xBA\xE1\xBF\xE9\x5B\xE8\x19\xE9\x0B\xD6\xFF\xE9\xF8\xE1\x14\xEA\x73\xE2\x16\xEA\xFC\xE1\xF1\xE9\x1C\xD5\x92\xE9\xF0\x6D\x40\xC1\x6F\xE8\x81\xE9\x6E\xE9\xBC\xE9\xA2\xE8\xAC\x9F\x2A\xDE\x85\xDA\x16\xDE\x51\xDB\xD4\xE2\x26\xDF\xC1\xE1\x6A\xDC\xC3\xE1\x16\xDC\x7C\xE9\x1D\xBA\xB6\xE9\x8B\xD4\xC6\xDB\x98\xE2\x58\xE9\x37\xEA\xD1\xE9\xD0\xE2\x0D\xE2\xE5\xDA\x0F\xE2\xF0\xD6\x11\xE2\x2F\xD5\x13\xE2\xC6\xE9\x62\xE8\x16\xE2\xF6\xDD\x7F\xC8\x13\xDF\x80\xDF\x15\xDF\x82\xE8\x50\xCB\x83\xB9\x20\xEA\x85\xBC\x47\xE9\xE4\xE9\x85\xE3\x9D\xE3\x22\xE2\x88\xE3\x96\xDE\xAF\xDE\x13\xE3\x8C\xE3\x15\xE3\x92\xE8\x17", "\xE3\xA7\xE3\xA5\xCB\xF0\xE3\xF8\xC6\xF2\xE3\x32\xDF\x8B\xD4\xF7\xE3\x7C\xE2\x52\xE8\xF7\xE9\x8D\xDF\x66\xEA\x30\xE9\x9B\xE9\xE4\xE8\xF8\xDC\x4E\xE9\x85\xDE\x50\xE9\x87\xDE\x44\xE8\x89\xDE\x54\xE9\xCC\xC1\x47\xDF\x55\xDC\x16\xD6\x1D\xDC\x6D\xBB\xC4\xCB\x87\xC8\xDB\xE3\x40\xDC\x62\xEA\x8F\xC2\x64\xEA\xA9\xE9\xEB\xDB\x20\xDF\x27\xEA\xA5\xE8\xFD\xE9\xA7\xE8\x2B\xEA\x71\xE2\x2D\xEA\xC3\xE2\x2F\xEA\x75\xE2\x62\xDF\x14\xD6\xC9\x91\x2F\xCF\x98\xC5\xFB\x18\x13\xE4\x3E\xDC\x91\xEA\xA9\x67\x93\xEA\x37\xA7\x95\xEA\x39\xEA\x88\xDB\x3B\xEA\x0E\xE3\x3D\xEA\x02\xE4\x3F\xEA\x25\xE2\x5F\xE8\x5D\xE4\xD7\xE2\x29\xE2\xD9\xE2\x61\xE4\x72\xEA\x29\xE4\x46\xE4\xB2\xC5\x52\xCF\xB1\xDA\x5B\xDC\x2F\x9B\x96\xE9\xCA\xE6\x98\xE9\x89\xE8\x5C\xE9\x0E\xEA\xCD\xE8\x10\xEA\xCF\xE8\x35\xE9\xD1\xE8\x9F\xEA\xD0\xE3\xA1\xEA\x8E\xE2\x0E\xD0\x38\xDE\x7B\x85\x65\xE4\x72\xDC\x8D\xCF\x89\xC8\xD3\xC8\xD5\xC5\xB7\xD0\x74\xCF\xF1\x82\x51\xCC\xB1\xE1\x62\xDA\x71\x6D\xED\x00\x5E\xDC\xF8\xE9\xF4\xE2\xB7\xE8\xFB\xE9\x18\xE9\x9B\xEA\xBB\xE8\x9D\xEA\xC1\xE2\xD1\xEA\xEC\xE3\xD3\xEA\x4E\x9B\xD6\xE8\xA4\xD6\xD5\x73\xA6\xD6\x74\x66\x56\x70\x6B\xD3\x73\xDD\x8D\xD6\xF2\xDA\x80\xDC\x06\xDC\xB5\xE8\xE2\xE2\x9F\xDA\x7F\xEA\x4C\xE9\xE5\xE8\x82\xEA\x78\xE3\x84\xEA\x7A\xE3\x86\xEA\x7C\xE3\x46\xE8\xA8\xE1\xC6\xDC\x86\xD6\xB8\xD9\x69\xE8\xE8\xDC\x88\xD3\xEA\xDC\x17\xC6\xED\xDC\xC4\xB6\xE5\xEA\xFF\xEA\x23\xEA\xE8\xEA\x4A\xE9\x17\xE9\x6B\xB9\x29\xEA\xAE\xD9\xEE\xEA\x3B\xE3\x01\xEA\xC8\xDE\x03\xEA\x61\xDF\x0B\xE9\xC8\x73\x02\xDD\xE6\xE1\x29\xBF\xC8\xD6\xE5\xD9\x39\xC6\x0A\x99\x18\xEB\x29\xE0\x6F\xDF\x65\xEA\x9C\xE3\x7E\xEA\x68\xEA\x38\xE2\x4C\xE3\x3D\xE4\x4E\xE3\xA0\xE9\x3F\xDD\xA2\xE9\x41\xDD\xEC\xE8\xDC\xD6\x4A\xBF\xDE\xD6\x2B\xDD\x55\xC6\x84\xDF\xDB\xA7\xF8\xB0\xF8\xB1\x57\xE9\x03\x79\xE6\xEA\x7C\xEA\x34\xEB\xE6\xE9\x5D\xE9\xE8\xE9\x88\xE9\x04\xE9\x12\xEA\x79\xE8\xF0\xEA\x25\xE4\xF2\xEA\xD2\xE3\x55\xE9\x44\xDD\x49\xEB\x30\x79\x4B\xEB\x04\xDA\x1C\xE4\xD7\xDC\x4B\xE9\x32\xE9\x3F\xE8\x60\xE3\x70\xDE\x8A\xE2\x72\xDE\x8C\xE2\x57\xEB\xEE\xE3\x11\x90\x2D\xE2\xE2\xEA\x18\xCD\xCC\x69\x30\xEB\x87\xDC\xD8\xE7\xA9\xDE\xE7\xEA\x0B\xE3\xE9\xEA\x4F\xEB\xFC\xE9\x51\xEB\xEA\xE9\x53\xEB\x06\xE9\x55\xEB\x7B\xE8\x65\xE3\x5D\x92\x47\xE8\xCA\xAD\x49\xE8\xAD\xB1\xC6\xA1\xD9\xE8\xCC\xDC\x45\xDA\x28\xE9\x14\xE0\xE4\xEA\x5D\xEB\x61\xDD\x5F\xEB\xC0\xDE\xEA\xEA\x1E\xEB\xEC\xEA\x1A\xE9\x7B\xEB\x1C\xE9\x7D\xEB\xD3\xE8\x7F\xEB\x7D\xE8\xE2\xA1\xB5\xC3\x7D\x97\x40\xCD\xF1\xE8\xAF\xC9\x16\xD0\x88\xD7\x6E\xBB\xF6\xE8\x21\xDC\xFD\xEA\x3C\x78\x8C\xEB\x2A\xD9\x84\xE9\xFA\xE9\x77\xEB\xEB\xEA\x79\xEB\xFE\xE9\x94\xEB\xEC\xE9\x96\xEB\x08\xE9\x69\xEB\x27\xE4\x69\xD7\x5D\xC2\xD2\xBF\xA5\xDD\xF4\xE3\x4A\xE4\x6F\xD7\x69\xDF\xA6\xEB\x19\xEB\x2E\xE9\x7D\xEA\x4E\xEB\xCB\xEA\x5E\xE9\xCD\xEA\x60\xE9\xCF\xEA\x62\xE9\x67\xEB\x38\xE9\xB3\xEB\x0A\xE9\x8F\xE2\x5D\xE2\xF6\xC6\xAD\xDA\xA5\xD0\xC3\xDD\xA8\xD7\x96\xE2\x83\xB9\x70\xEB\x01\xDA\xAE\xE7\xAE\xDD\x5C\xD2\xE1\xE8\xF1\xE1\x00\xE9\x99\xEA\x02\xE9\xAD\xEB\x9C\xEA\xAF\xEB\x00\xEA\xB1\xEB\x1E\xE9\xCA\xEB\x20\xE9\x9A\xEB\xAB\xDA\x11\xC7\xDE\xC3\x3F\xE9\xB0\xDA\xA9\xEA\xB2\xDA\x9F\xCD\x65\xCE\xD5\xEB\x17\xDA\x36\xDB\xA1\xE8\xB1\xEA\x3D\xA3\x3C\xEA\xD2\xE2\xAD\xE9\x9A\xDD\xAF\xE9\x42\xEA\x28\xDF\x58\xEA\xC8\xE9\x5A\xEA\x14\x92\x56\xE9\xDD\xE2\xBD\xEB\x31\xEB\x8C\xDF\x5E\xEB\xCA\xE8\xC1\xEB\x03\xEB\x62\xEB\x4D\xE9\x64\xEB\x41\xE8\x66\xEB\x63\xE3\x73\xDE\x98\xEB\xC1\xE8\x67\xE9\xDB\xDA\xA6\xB6\xF0\xEB\xA7\xEB\x89\xD9\x8E\xEB\xE2\xE8\x1D\xEB\x9C\xBB\x1F\xEB\xF1\xDB\x21\xEB\xB8\xE3\x23\xEB\x0E\xDF\xBB\xE3\x1D\xCB\xE3\x80\x7E\xE9\xF8\xE8\xFB\x69\xF1\xEB\x65\xDA\xF3\xEB\x00\xEB\x49\xE3\x94\xDE\x69\xEA\x24\xE2\x6B\xEA\x5C\xE4\x14\xE3\x5E\xE4\x16\xE3\x60\xE4\x99\xDF\x62\xE4\x9F\xDE\x30\xCC\x18\xB4\x32\xD0\x04\xE3\xD7\x9D\xFE\xEA\x05\xEC\x1D\xDF\xB0\xEA\x1A\xDD\xBE\xE9\xED\xDB\x01\xE4\xC1\xE9\x88\xDA\xC3\xE9\xD5\xE2\xB9\xEA\x61\xE8\xBB\xEA\x63\xE8\x1C\xDB\xA0\x71\x39\xD0\x17\xEB\x18\xEC\x28\xDC\x1A\xEC\xDB\xEB\x26\xEA\x46\xEC\x58\xE4\x1E\xEC\xDC\xDC\xBC\xE8\x31\xDE\xBE\xE8\x7C\xCE\x24\xEC\x68\xCB\x67\xE3\xBB\xB7\x17\x8B\x1F\xD5\x5B\xEB\x2A\xEC\x95\xE6\xD7\xEB\x4E\xEA\xF6\xE2\xF7\xEB\xD0\xDD\x11\xE3\xF3", "\xDE\xDE\xDC\xF5\xDE\x93\xDB\xF7\xDE\xFF\xE2\x4A\xD0\x41\xE3\xAF\xC7\x92\xA9\x68\xEC\xB0\xE7\x72\xEB\x60\xDD\xA8\xEB\xE3\xE3\x60\xEB\x1C\xEC\x6E\xBF\x92\xEB\x2A\xEA\xE1\xEB\x2C\xEA\xC8\xEB\x64\xE9\x12\xEC\x77\xD9\x40\xE3\x55\xE3\x8D\xDE\x03\xBA\x7A\xEC\x80\xE4\x6A\xEC\x0C\xEA\x73\xE8\xC2\xEB\x50\xEB\xC4\xEB\x89\xE9\xC6\xEB\x8B\xE9\x87\xEC\x8D\xE9\x89\xEC\x66\xE9\xD5\xEA\x68\xE3\x00\xBC\xF4\xE9\x4A\x99\x0E\x93\x8F\xEC\xF5\xDA\xA2\xE7\x6B\xEC\x0D\xE3\x01\xE9\x0F\xE3\x5B\xEC\xEF\xDD\x5D\xEC\x07\xE4\x5F\xEC\x6C\xCF\x25\xEB\x1F\xDE\x28\xDD\xE8\xB3\x8F\xD8\x0F\xB9\xA4\xEC\x0B\xDB\x2C\xEC\x1A\xEB\x75\xEB\x1C\xEB\x90\xEB\x1D\xEC\x83\xEC\x20\xEB\x85\xEC\x9E\xEA\x9A\xEC\x15\xEA\x9C\xEC\x8F\xE9\x6B\xEB\x9E\xE0\xCD\xDE\x94\xE3\xCF\xDE\x4A\xEB\xBE\xEB\x83\xE9\x7F\xEC\x8F\xEB\xAB\xEB\x91\xEB\xDF\xEB\xED\xEA\xC1\xEC\xEF\xEA\xC3\xEC\x2E\xEA\xC5\xEC\x17\xEA\x31\xEA\xEA\xC9\xB3\xCE\xE6\xDE\x2F\xEB\x54\xEC\x36\xDD\xCF\xEC\x1B\xEC\xBD\xEC\x82\xEC\xD3\xEC\x93\xEB\x98\xEC\x13\xEA\xD7\xEC\xA0\xEA\xD9\xEC\x30\xEA\x9E\xEC\x64\xEC\x55\xC1\x89\xEB\x7F\xD9\x7E\x75\xE0\xEC\xAF\xDD\xDA\xEB\x21\xE3\x81\xEC\x9F\xC1\xAB\xEC\x10\xE2\xAD\xEC\x77\xE9\xAF\xEC\xFE\xD4\xB1\xEC\xCA\xDE\x28\xE4\xFA\xDB\x1B\xDC\xF2\xDF\x2F\xBB\x4C\xB4\x26\xE9\xDF\xD5\xBC\xEB\x69\x78\xF4\xEC\xD9\xEB\x49\xE9\xE3\xE2\x36\xEB\x53\xE2\x39\xE2\x9E\xE9\x40\xDF\x3B\xEB\x42\xDF\x3D\xEB\x44\xDF\x3F\xEB\x2F\xD6\x73\xEA\xA6\xD7\x75\xEA\xB1\xDA\x78\xEA\x10\xE9\x0B\xED\xCD\xEC\x33\xEB\xB1\xE3\x09\xEC\x10\xED\x3B\xE4\x3E\xDF\x13\xED\x3B\xE2\x15\xED\x3D\xE2\x17\xED\x3F\xE2\x19\xED\x46\xDF\x5C\xD9\xCE\xC1\x19\xB8\xB6\xAA\x8E\xEA\x4B\xD6\x8E\xCB\x15\xE4\xE6\x65\xB7\xEC\x35\xDB\xA6\xEC\x92\xEC\x85\xE9\x0A\xEC\x87\xE9\x96\xEC\x52\xEB\xE8\xEC\x54\xEB\xEA\xEC\xD2\xEA\xEC\xEC\xA2\xEA\x02\xED\x31\xED\x96\x95\x85\xE6\x96\xDA\xA7\xEA\x57\x9B\x79\xE2\xF5\xE8\x68\xDF\x38\xED\xB9\x69\x3A\xED\x5F\xDB\x0C\xDB\x23\xED\x72\xE8\x3E\xED\x26\xED\x9F\xE3\xA2\xDA\x8E\xE8\xA4\xDA\x2B\xED\x58\xE2\x2D\xED\x5A\xE2\x2F\xED\xA3\xD0\x7F\xDF\x93\xE2\x39\xCB\xDF\xE7\x83\xDF\xB9\xEB\x16\xCF\x86\xDF\xF0\xC1\xB6\xE0\x8B\xEB\x22\xED\x96\xEA\xB1\xDD\x98\xEA\x59\xEC\xC0\xE9\xFA\xEC\x53\xEA\xFC\xEC\xC8\xD4\x22\xEC\x7A\xDF\x61\xEC\xF6\xCC\x63\xEC\xCE\xC8\x87\xCB\x7A\xCF\x8A\xEB\xDC\xEA\xE0\xCB\xDE\xEA\x23\xD3\xA3\x27\x36\xE8\x95\xE3\x8B\xDC\x0B\xD1\x83\x8E\x32\xEB\x72\xED\x39\xE4\x9E\xE1\x11\xED\x38\xEB\x29\xED\x56\xE2\x60\xED\xEA\xE2\x62\xED\xA8\xE2\xA0\xD6\x65\xE8\xE5\xDC\x10\xD0\x86\xD3\xAD\xE1\x4D\xE8\x9E\xD9\x73\xCC\x5A\xDD\x28\xEC\xCC\x69\x8B\xED\x2C\xD1\x60\x90\x39\xD2\xD8\xEB\xCB\xC4\x0E\xED\x02\xEB\x5B\xED\x9C\xE9\x24\xE3\x94\xED\xE8\xE2\x96\xED\x28\xE3\x98\xED\xEC\xE2\x9A\xED\x5B\xDD\xAB\xCF\x98\xD9\x6F\xDD\x68\xE8\x9B\xD9\x12\xEB\x6B\xE8\x8D\xDC\x6D\xE8\x16\xEB\x03\xBA\xA6\xED\x6F\xED\xA8\xED\xC4\x49\xA7\xEC\x56\xE4\x75\xED\x28\xEA\xBF\xEC\x1F\xEC\xD5\xEC\x22\xEB\xE3\xEB\xEE\xE9\xE5\xEB\x3A\xE9\x27\xEB\xE7\x42\xE5\xE1\xBC\xCF\x2C\xEB\xFB\xC2\x2E\xEB\xC4\xB6\xC4\xED\x84\xE1\x05\xE7\x69\x55\xC8\xED\x59\xE8\xDD\xEB\xAA\xEC\xCC\xED\x5C\xEC\x20\xEC\xA9\xE8\x7B\xED\x3D\xE3\x7D\xED\x74\xDA\xB5\xEB\x3A\x0F\xFF\xE1\x90\x30\xC9\xCF\x49\xE4\x2E\xDD\x47\xEB\x17\xC3\x5B\xEB\xDC\xED\x88\xDF\xDE\xED\xD0\x48\x54\xDF\x43\xEC\x12\xDE\x45\xEC\xB3\xDD\x6E\xEC\x5A\xE4\x70\xEC\xF1\xDD\x72\xEC\xD8\xDB\x74\xEC\x75\xD8\x04\xB3\x01\x8E\x94\xB5\x92\xA9\xF6\xED\x4D\xE4\x7D\x49\xDF\xED\x3D\xED\xAA\xEB\x94\xEC\x78\xEB\x41\xED\x7A\xEB\x43\xED\x7C\xEB\x45\xED\xF1\xEA\x47\xED\xD4\xEA\x00\xDD\xC0\xED\x2E\xE2\x51\xE8\x00\x00\x0B\xEE\x04\xE7\xC6\xED\x0E\xEE\xC9\xEA\x1D\xE4\x11\xEE\xAC\xEB\x13\xEE\xAE\xEB\x15\xEE\x95\xEB\x17\xEE\x56\xEB\x19\xEE\xF3\xEA\x81\xEB\xAB\xB1\x83\xEB\x0F\xB5\x85\xEB\x47\xE2\x31\xD7\x88\xEB\xA4\xEB\xDD\xE8\x27\x01\x20\xEE\x9B\xD0\x82\xCF\xEE\x57\xD4\xDE\x8F\xED\x67\xEA\x87\xE3\x37\xEB\x89\xE3\x39\xEB\x8B\xE3\x3F\xE4\x6E\xEA\xB5\xED\x2A\xE3\x64\xED\xAA\xE2\x58\xDA\xEF\xE8\x26\xE1\xDE\xDB\x9B\xC8\xD2\xEB\xED\xEB\x63\xE2\xA5\xEB\x03\x01\x3B\xEE\x2B\xE4\x22\xEE\xF9\xED\x73\xEB\x4C\xEB\x24\xED\xCA\xEA\x3F\xED\x0F\xEA\x5F\xE3\x34\xE9\x61\xE3\x0F\xEC\x43\xE8\x11\xEC\x45\xE8\x75\xDE\xD4\xED\x7A\xA5\x9C\xC3\x0E\xE9\x83\xB9\x57\xEE\xA6\xEA\x8D", "\xED\x06\xEC\x8D\xEB\x08\xEC\x5E\xEE\xAE\xED\x80\xEA\x02\xDE\xE6\xE8\x04\xDE\x79\xE3\x06\xDE\x52\xE9\x08\xDE\x88\xEA\xC1\x7A\x22\xE9\x91\xE2\x6B\xD4\x67\xED\xDD\xDD\x95\xE2\xED\xEB\x97\xE2\x50\xDF\x09\x01\x6E\xEE\x4D\xED\x70\xEE\x42\xEC\x74\xEB\x54\xE4\x76\xEB\x26\xEE\xD2\xEC\x28\xEE\xE0\xEB\x2A\xEE\xB0\xEB\x2C\xEE\x7E\xEB\x67\xEE\x99\xEB\xCC\xEB\xDA\xDD\x9A\xCD\xEB\xEB\x25\xE9\x5F\xEA\xAB\xD7\x03\x01\xAD\xD7\x43\xE9\x01\x01\x8A\xEE\x86\xD7\x8C\xEE\x3F\xEE\xFB\xED\x1F\xDF\xFF\xE3\xCA\xED\x9A\xEA\xE6\xEC\x84\xEC\x95\xEE\xE2\xEB\x97\xEE\x97\xEB\x99\xEE\x13\xEC\x8E\xAD\xC8\xDA\x20\xD0\x0F\xB9\xA6\xEE\xD1\xEB\xC0\x99\xA9\xED\xE0\xED\xDC\xEB\xAD\xEE\xDE\xEB\x93\xEE\xD4\xEC\xB1\xEE\x86\xEC\x10\xEC\x68\xEB\x2E\xEE\x58\xEB\x20\x80\x68\xE9\xB3\xE2\x56\xEE\x4E\xD6\x0D\xEE\x5A\xEE\x7D\xEC\x19\xEC\x73\xEE\x25\xEE\x5F\xEE\xCC\xEA\x61\xEE\x11\xEA\xC5\xEE\xC2\xEC\xC7\xEE\xC9\xEB\xC9\xEE\x6A\xEB\x35\xB3\x27\xEC\xC6\xE1\xB9\x69\xBB\xEE\x51\xEE\xBD\xEE\xC7\xED\x0F\xEE\x25\xEA\x61\xEB\x40\xED\xD8\xEE\xCE\xEA\x63\xEE\x36\xE9\xB3\xEE\xB2\xEB\xDE\xEE\xB4\xEB\xEE\xEC\x20\xCB\x3A\xDE\x05\xE3\x06\x01\xE4\xEE\xA2\xE6\x23\xEE\xF4\xEB\x44\xEC\xB2\xEA\xA9\xEC\xB4\xEA\x48\xEC\x18\xDE\x4A\xEC\x41\xEA\xC5\xE9\x43\xEA\xC7\xE9\x45\xEA\x19\xD8\x51\xEC\x6A\xB3\x0A\x99\xF9\xEE\xCE\xD1\xE7\xEE\x24\xEE\x80\xEC\xE4\xEC\xF9\xEC\xE4\xED\xAC\xEC\xE6\xED\xBD\xE8\xE8\xED\xBA\xE3\x00\xED\xBC\xE3\xF4\xEE\x90\xCA\x7E\xB3\x11\xB7\xBA\xEE\xCF\xEE\x22\x6F\x0F\xEF\xFC\xEE\xFC\xED\xFE\xEE\xE2\xED\x00\xEF\x77\xED\x41\xD7\x54\xEA\xBD\xD6\x56\xEA\x06\xEF\xFE\xEB\x08\xEF\xC9\xE9\x36\xEE\xA6\xCA\x47\xDB\x03\xEC\xCE\xEE\x8C\xED\xD6\xD1\x71\xEE\x7E\xEC\x56\xEC\xF7\xEC\x12\xEF\x38\xC3\x29\xEF\x60\xD7\x2B\xEF\x57\xD8\x2D\xEF\xFD\xEB\x4E\xEC\x59\xEA\xDA\xE2\x30\xA3\x50\xCE\x40\xB7\x94\x92\x0D\xEF\x9F\xEB\xBE\xEE\xE8\xEE\x90\xEE\xD6\xEE\xC3\xEB\xEC\xEE\xC5\xEB\xEE\xEE\xD0\xEA\xF0\xEE\xE4\xEB\xF2\xEE\xCB\xEB\x1C\xEF\x43\xC9\x7A\xD8\xA2\xEC\x0A\xEE\x21\xEF\xF8\xED\x69\x5F\x5B\xEE\x07\xEC\x5B\xE9\xD5\xEE\x75\xEE\x04\xEB\x81\xEA\x0D\xEC\x4F\xE9\x64\xEE\x51\xE9\x0A\xEB\x53\xE9\x68\xEE\x8B\xEC\x48\x0F\xB8\xDE\xF5\xED\x60\xEF\x59\xEE\x62\xEF\xD2\xEE\x55\xEC\xD4\xEE\x11\xEF\xD1\xEC\xBE\xEC\xAF\xEE\xC0\xEC\xDA\xEE\xD6\xEC\xDC\xEE\x88\xEC\xB5\xEE\x8A\xEC\xC7\xEC\x36\xE0\x93\xE3\x92\xD5\xDB\xED\x75\xEF\xE6\xEE\xFB\xEE\x2D\xEC\xBD\xE9\x26\xEF\xC1\xEE\xE3\xED\x7E\xEF\xCD\xED\x80\xEF\xCF\xED\x57\xEF\xD1\xED\x59\xEF\xE6\xEB\xDB\xEC\x51\xD0\xAF\x94\xB4\xCE\xC3\xED\x8B\xEF\xCD\xD0\x23\xEF\x8E\xEF\x3A\xEA\xF6\xEB\xB3\xEA\xF8\xEB\x73\xE9\x5A\xDF\x74\xD5\x5C\xDF\x93\xCE\xB2\xE9\xDB\xCC\xB4\xE9\x97\xD0\x3A\xEC\x5F\xDA\x8F\xBC\x6D\xEE\xA0\xEF\x3D\xEE\x8E\xED\xAA\xEE\x56\xDF\x74\xED\xFE\xED\xF8\xE2\x6F\xEC\xFA\xE2\x71\xEC\xFC\xE2\x73\xEC\xFE\xE2\x06\xEE\x82\xB4\x00\xD9\x0F\xE4\xF6\x95\xE0\xDB\x45\xC8\x08\xED\x7C\xC1\x0A\xED\x02\x01\x4C\xEF\x5C\xDA\xA8\xEE\x03\xDF\x40\xEE\x35\xEB\x42\xEE\x92\xED\x44\xEE\xB1\xED\x26\xE3\xB3\xED\x50\xE3\x49\xEE\x52\xE3\x4B\xEE\x8C\xC1\x1B\xED\x80\xDF\x1D\xED\xED\xEB\x1F\xED\x22\xDC\xCD\xEF\xB5\xEF\xD0\xEF\xFA\xED\x8E\xEE\x57\xE8\x50\xEF\x67\xEF\x0B\xEC\x05\xEB\x6A\xEF\x83\xEA\x6C\xEF\x85\xEA\x66\xEE\x87\xEA\x70\xEF\x89\xEA\x4A\xED\xFB\xDB\xAE\xDA\x4C\xD1\x8F\xD0\x12\xE4\xCA\xEF\x4E\xDF\xB4\xEF\x37\xEF\x4E\xEF\x10\xEF\xD0\xEC\x91\xEE\x7D\xEF\xC3\xEE\xE7\xEC\x55\xEF\xC7\xEB\x82\xEF\x9B\xEC\x84\xEF\x9D\xEC\x86\xCB\x45\xE4\x02\xE3\x3C\xEE\xBA\x0A\x2D\xE4\x45\xEB\x2B\xC8\x34\xCF\xFF\xEF\xA7\xED\x8C\xEF\xD1\xEE\xAA\xED\xF2\xC4\x38\xE4\x41\xEE\x3A\xE4\x5C\xED\xA2\xE2\x5E\xED\xA4\xE2\xE8\xE8\x89\xD8\xDB\xEF\x8F\xE3\xDD\xEF\x94\x95\xA4\xEA\x1D\x9F\xCA\xDF\xB3\xC5\xC3\xEA\x4C\xE4\x21\xEE\xA5\xED\xE6\xEF\x38\xEF\x8D\xEE\x5C\xEE\x59\xED\x10\xEE\x51\xEF\x95\xEC\x53\xEF\x97\xEC\x08\xF0\x99\xEC\x0A\xF0\xC4\xEC\x0C\xF0\xC6\xEC\x28\xC8\x9F\xEC\x59\x1A\xD8\xEA\x1C\xD3\x79\xDC\xC1\xEA\xAF\x9B\xDD\xEA\x6B\xE4\xDF\xEA\x9F\xDF\xD6\x7D\xCF\xB0\x14\x65\x68\xB1\x15\xD1\x42\x45\xA3\xE6\xA4\xE7\x9B\x10\xB5\x07\x2C\x00\x34\xE8\xA4\xE6\xEC\xA5\xB7\x99\x27\x01\xAB\xDF\x70\x6C\xC4\xA0\xF0\x27\xE3\x35\x88\xE7\xB9\xDF\x64\x00\xB4\xDF\xAA\x07\xE8\x35\x64\xF0\xFF\x00\x86\xCF\x2D\x00\xA6\xE7\x48\x0F\xFC\x8F\x5E", "\xF0\x32\xD1\x60\xF0\x7C\xA3\x62\xF0\xBC\xE7\xE1\xCE\xAE\x9B\xD9\x4C\xB5\x35\xB4\xDF\xF8\x08\xB7\xDF\xCB\x3F\x19\x60\xCF\x0C\x64\xF0\x8F\x79\x72\x4B\x70\xF0\x48\xCC\x1C\x65\xEB\x63\x92\x46\xB0\xDF\x64\xF0\xB4\xDF\x91\x0E\xE7\x5F\x80\xF0\x7D\x6C\x71\xE1\x06\x01\x2E\x00\x59\xF0\xEA\xB4\x08\xEE\x14\xE6\x92\xF0\x5A\xF0\xD7\x6B\x35\xE6\x01\x01\x5B\xD9\x0E\x66\x85\x0F\x60\xD1\x47\xB1\x1B\xE7\x82\x9F\x47\xD1\x77\xD1\xCA\xA6\xD0\xA5\x87\xD1\x11\x01\xBB\xE6\x8A\xD1\x83\x02\x71\xD1\x1C\x75\x55\xD1\x61\xE1\xAD\xF0\x83\xD1\x36\x45\x75\xA6\x88\xA6\xA6\xF0\x68\x00\xBB\xE6\x4E\xE6\x21\x01\x9E\xF0\x1C\x75\x5F\x00\x0C\xBE\xBB\xF0\xFF\xE0\xB1\xF0\x87\xA6\xE0\xDF\x6C\xD1\xA7\xF0\x6E\xD1\xD7\xA6\x70\xD1\x70\x0F\x50\xD1\x1C\x75\x5D\x00\x0C\xBE\xCA\xF0\xBE\xF0\x33\x7C\x76\xA6\xC2\xF0\xB5\xF0\x7A\xD1\x5E\xD1\xEF\x64\x86\xE6\xA6\x80\x97\xBE\x18\xE8\xC7\xEF\x71\x0C\x52\x62\xFF\xE7\xD4\xB0\x1E\x38\x93\x1E\x03\xE8\x05\xE8\xC2\xE6\x43\x0F\x56\x64\xDB\xF0\x0A\xE8\xDD\xF0\x09\x61\xEE\x05\x2A\xE8\x07\xD1\xBC\xA0\x32\x06\x2D\xE8\xA4\xF0\xCF\xF0\xB4\xF0\x97\xF0\x0E\xD1\xA2\xA5\x32\x00\xDD\xE7\x73\x66\x75\x0C\xD1\x40\x1F\x47\x94\x05\xE3\xB0\x8C\x58\xE5\xB0\xF8\xE7\xB3\xEF\x34\x17\xF6\xF0\x19\x85\x84\x36\xFC\xF0\xBB\x60\xFE\xF0\x70\xE1\xCE\x95\x05\xE6\x92\xE3\x8E\x10\x83\xDC\x97\xC2\x5C\x0A\xFB\xDF\x9D\xE7\xE7\xE5\x78\x08\xF2\xF0\xAE\x6B\x14\xE7\x00\x00\x34\x00\x6D\xF0\x8D\x63\x70\x0F\x04\xE8\x21\xE8\xA0\xF0\xBB\xA3\xDA\xDF\xEE\x88\x9E\x0B\xEE\xF0\x23\xA7\x95\xE0\xD0\xF0\xA2\xE0\x0A\xE7\x03\x01\x35\x00\x96\xF0\xB7\x6F\x16\x65\xDD\x6A\x37\x00\xDD\xE7\x5C\x75\xBB\x7C\x8D\xE4\x34\x86\xE8\x29\x5D\x1C\xFA\xB0\x51\x76\x32\xF1\xF7\xE7\xC3\xE8\x40\x10\x38\x00\xFB\xE7\x11\xF0\xB3\xBD\x19\x37\x69\xAB\x34\x62\xE0\xF0\x1D\xF1\x06\xE8\xE5\xEE\xD1\x04\x0A\x37\x7B\xE0\xA8\xDC\x09\xA0\xDD\x41\x4E\x6F\x0A\xA7\x50\x74\x2A\x6C\x4D\xF1\x23\xF1\x94\xE0\xCB\xA6\x10\x7C\x30\xE8\x19\xD1\x60\x6C\x2B\xF1\x14\xF1\x19\x7D\xDA\x7A\x3A\x00\x19\xF1\xC0\xA5\x27\x01\xFF\x95\x1C\x75\x0D\xE1\x45\xD1\xF6\x7B\xE6\xAA\xED\xF0\x6B\x68\x10\x96\x0B\xE1\x5A\xD1\x11\x01\x5B\xF1\xC3\xE8\x53\xAB\xAC\x74\x56\xAB\xC1\x2C\x58\xAB\x14\x01\x5A\xAB\x88\x37\xF2\x03\x3E\x05\x46\xAB\x5D\xB1\x50\x37\x4B\x06\xF0\x73\x8E\x62\x65\xAB\xDC\xD9\x3E\x06\x12\x43\x23\xE0\x35\xD3\xDA\x6F\x40\x29\x6E\xF1\xBC\xDF\x16\x65\x10\x66\x3B\x00\x18\xE1\xAC\xBE\x09\x01\x03\xD1\xCD\xCF\x5C\xE6\x29\xE0\xDB\x37\x2B\x91\x3F\xE6\xD3\xF0\x83\x7B\xC1\xA5\x27\x01\x4C\xA6\x32\x73\x37\x06\x73\x6C\x99\x60\x96\x0B\x95\xF1\x0F\xE8\x12\xA6\xA6\xA6\xB0\xF0\xCE\xF0\xB3\xF0\x9D\x5C\xD2\xA5\xF2\xA6\x9B\x7B\xCB\x90\xF4\x1E\xDC\xE0\xA4\xED\x5C\x02\x62\xA6\x03\xA6\x38\x41\xDC\xA5\x27\x01\xA8\x7B\xD9\xCF\x91\x08\x9E\xF1\x2C\x64\x34\x5B\xA1\xF1\xC6\xE5\xCF\xD2\xA3\xF1\x95\xA6\x73\xA6\xBF\xF0\xA9\xA6\xEB\xA5\x88\x94\x23\xB3\xE1\xD0\xAD\x70\x89\x68\xB9\xF1\xA0\x47\x12\x2A\xBC\xF1\xD4\xE1\xBE\xF1\x71\xA6\xC0\xF1\xCD\xF0\xB2\xF0\xC1\xF0\xB4\xF0\xD7\xE0\x61\xA6\xD9\xA5\x31\x10\xD0\x7B\x36\xD1\x85\x07\x07\xA6\x0E\x9A\x92\xF1\x71\xEB\x8D\x17\x94\xF1\xDC\x8F\x96\xF1\x54\x28\xBF\xF1\x9A\x11\xC1\xF1\xA6\xF1\xD4\xF1\xA8\xF1\xFC\x7B\x70\x80\xA1\x71\xBC\x93\x97\xCF\xC9\xF1\xDF\xD0\xE2\xF1\x9E\x98\xE4\xF1\x5E\x2F\xE6\xF1\x51\x03\xE8\xF1\x80\xE6\x0D\xA7\xE3\xAC\x2B\xA6\xAE\xA6\xDF\xF1\xD6\xEB\x64\xE6\xCC\xF1\xE3\xF1\xA2\xF1\xD0\xF1\xE7\xF1\xD2\xF1\xC0\xF0\x2F\xE8\xCD\x99\x7D\x42\x93\xAB\xFF\xF1\xF2\xEB\x01\x56\xF3\xF1\x52\x67\xF5\xF1\x24\x33\xF7\xF1\x1C\x11\xF9\xF1\x08\xF2\xC4\xF1\xEB\xDC\x71\x0F\x4B\xA6\xC3\xA5\x31\x07\xCA\xF1\xE7\x33\x10\xF2\xE8\xAE\x12\xF2\xE2\xA6\x14\xF2\x20\xF1\x0B\xA7\x2E\xE8\xC5\x5C\x5C\xA6\x7E\x12\x9E\x0B\xAE\xF1\xE2\xEE\x8C\x0E\xB1\xF1\x4D\x09\x65\xA6\x06\x04\x67\xA6\x44\x0F\x69\xA6\xFE\xF1\x1E\xF2\xCC\xB0\x02\xF2\xF4\xF1\x04\xF2\xA5\xA6\xD1\xF1\xA7\xA6\x69\xD1\x24\xA7\xAA\xA6\x55\x7C\x27\x01\x23\xD1\x2A\xAC\xF1\xF1\x93\xF1\x39\xF2\x11\xF2\x3B\xF2\x94\xA6\x06\xF2\x3E\xF2\x00\xE1\x40\xF2\xC5\x5C\x67\x7C\x27\x01\x75\xE7\x45\xE5\xB8\xF1\xF2\xF1\x48\xF2\x21\xF2\x4A\xF2\x9A\x7C\x4F\xF1\x42\x63\x13\xE8\x18\xA6\x7C\x7C\x86\x4B\x36\xF2\x56\xF2\xBB\xF1\x03\xF2\xBD\xF1\xC3\xE3\x24\xF2\x16\xF2\xC3\xF1\xA6\x5C\xAB\xA6\x09\x01\xAD\xA6\x0C\xF2\x37\xF2\xFC", "\x3E\x20\xF2\xEE\x03\x22\xF2\xCF\xF1\x3C\xF2\x75\x03\x68\xF2\xBB\xA6\x5E\xF2\xBD\xA6\xFE\x23\xDE\xF1\x6F\xF2\x7B\x4E\x71\xF2\xBB\x90\x73\xF2\x66\xF2\x05\xF2\x8F\x11\x77\xF2\x25\xF1\xF1\xF0\x34\x86\x00\xA7\x61\xF2\x47\xF2\x63\xF2\x3A\xF2\x65\xF2\xD2\xDE\x67\xF2\x07\xF2\x69\xF2\xFB\xF1\x29\xA6\x17\xA7\x8A\xF2\xE0\xF1\xE3\x37\x3D\x5B\xB1\x01\xCD\xF1\x1E\xE7\xF6\xF1\x83\xF2\x15\xF2\x91\xF2\x4F\xF2\x37\xA6\x04\xE1\xD0\xE1\x78\x74\x52\xE5\x17\x73\x2E\xE5\x86\x27\x69\x19\x4D\xE5\xA7\xCC\x4F\xE5\x59\x8E\x51\xE5\x5B\xBD\xC1\x05\x73\x6C\x98\x9C\xA2\xE4\x6C\xE5\xD2\xAB\x36\x70\xB2\xF2\x37\x9E\x65\xE5\x27\xC2\xCF\xE5\xAF\xE5\xF1\xE5\x7D\xBC\xB9\xBC\xF2\xE4\xA7\xF2\x8B\xE1\x29\x9F\x30\x23\x77\xE5\xB8\xE4\xED\xE4\xE2\xE4\x14\xE5\x1D\xA5\xC7\x90\xA1\xE0\x94\xE4\x7A\x9F\x6A\x1C\x88\xE5\xC1\x59\x8A\xE5\xDE\xE5\x09\xA5\xE0\xE5\x6A\xE5\xC6\xE4\xD3\xE5\x96\xBD\xA0\x66\xA8\xF2\x7D\x1D\x69\x19\xB9\xAB\xCE\xE4\xDE\xE4\x9A\xE4\xB6\xEB\xBD\xF2\x70\xBC\xA1\xE5\xB7\xF1\xB1\xF2\xDC\xF2\x8D\x58\x60\x02\xAB\xE5\x9A\xE5\xE2\xF2\x0C\xE9\x9D\xE5\xB6\xBD\x41\xC2\xE4\xE4\xFF\xE4\xCD\xF2\xA0\xE4\xB9\xF2\xEA\xE4\xBE\xE5\xEC\xE4\xBC\xF2\xD6\xF2\xD1\xE5\x57\xA5\xF4\xF2\xB8\xF2\x53\x9F\x42\x03\xCD\xE5\xF9\xE4\xD4\xF2\x6A\xEE\x2F\xBC\x29\xC2\xDB\x90\xF0\xBC\xFF\xF2\xE9\xF2\xB1\x0E\xDC\xE5\x07\xE5\x20\xE5\x00\xE6\x34\xC2\xE2\xE5\x0B\xF3\xC3\xF2\x92\x9E\xDE\xF2\xED\xE5\x7D\xC2\xC8\xF2\xE1\xE5\x15\xE5\xD9\xF2\x8F\xC2\xBF\x0A\x00\xF3\xCF\xF2\xD9\x0A\x38\xBC\xFE\xE5\x05\xF3\xCC\xAB\xF0\xF2\x08\xF3\xB7\xBC\xE1\x8D\x24\xE5\xFC\xDF\x88\x71\x20\xF3\xCB\x9F\x42\x03\x0D\xE6\x37\xA7\x9D\xE4\xC2\xF2\xEB\xF0\x2F\xF3\x60\x02\xD9\xBD\x43\xBD\x06\x68\xDB\xF2\x15\xF3\xB5\x9E\xAA\xF2\x36\xE5\xF4\xAF\x38\xE5\x1F\xF3\x0C\xF3\x69\x19\x2F\xE6\x18\xA5\x3E\xE5\xBC\x71\x42\x91\x91\xE1\x9A\xBC\xEF\xBB\xA6\xF2\xD6\x07\xA1\xA4\xDD\xB0\x2C\xF0\x03\xDD\xAC\xF2\x33\xE6\xAE\xF2\x1B\xC2\x2C\xE5\xA5\xE0\xA5\xA0\x72\x9A\xA1\xBE\xC1\x51\x0B\xF1\x71\x0F\xFF\xA4\x93\xAB\x08\x73\x9F\xA0\xBA\xF2\x6B\x8E\x1A\xF3\xD7\xF2\x0C\xBC\xFF\xE4\x61\xF3\x98\xA0\x71\xA0\x05\xE5\x12\xBC\x32\xC2\x65\xF3\xFD\xF2\xA1\xAB\xB5\xF2\xCB\x69\x69\xF3\x59\xF3\x7E\xA0\x30\xA0\xAC\xF1\xB2\x74\xB9\xE4\x9F\xE5\x28\xBC\x68\xF3\x4F\xF3\x6B\xF3\x5A\xA0\x2C\xBC\x9B\xE5\xD1\xE4\x07\xF3\x40\xC2\x09\xF3\x82\xAC\xC7\x90\x74\xF3\x5D\x83\x8D\xA0\x5C\xC8\xBE\xBD\xE0\x90\xED\xF2\x36\xAC\xE0\xE4\x27\xF3\x85\xF3\x29\xF3\xDB\xBC\x7D\xF3\x62\xF3\xF8\xF2\xFC\xC9\xBF\xE5\x10\xF3\x09\xE5\x01\xE6\x8D\x63\xF1\xE4\xD6\xE4\x3E\x14\x7E\xF3\x76\xF3\x70\xBD\x69\xA0\x7A\xF3\xC2\xBD\x8D\x63\xA8\xAC\xC1\xF2\x4E\xF3\x97\xF3\x6C\xF3\x73\xA0\x0F\xF3\xFF\xE5\x9C\xF3\x12\xF3\x48\x0F\xB9\xBD\xAA\xF3\x30\x09\xA2\xF3\xF7\x09\x18\xF3\xC1\xBD\xF2\xF2\x71\x0F\xF3\xE5\xE7\xF2\x0A\x73\xAC\xF3\xDC\xE4\x6D\x0C\x24\xF3\xAD\xE5\xDF\xE5\x92\xF3\xEE\xE4\xE4\xBC\xCF\xBD\x0E\xF1\x58\xF3\x8A\xF3\xA0\xE7\xCF\xE1\xEE\x8E\xC2\xE7\x25\xE5\xCC\x69\x89\xF3\xA5\x85\x99\xA0\x19\xE6\xDC\xD0\xCB\xF3\xD4\xF3\xCD\xF3\xEA\xDF\xFC\xDE\x8A\xBD\x6C\xE9\xD2\xF3\xB7\xF3\x45\xF3\x23\xBC\x47\xF3\xAD\xF2\x55\xF0\x8B\xD3\x82\x9F\xCD\xCF\x80\x66\xE9\xF2\x07\xF1\x21\xE0\x52\xF3\x57\xBD\x54\xF3\x7F\x83\xAF\xF2\x1C\xC2\xFE\x72\xEA\xF3\xBD\xA0\x0F\xA0\xC7\x90\xE9\xF3\x3C\xF3\xCA\x14\x53\x0C\x63\xF3\xBA\xF3\x86\xF3\x67\xF3\x72\xF3\x8A\x6A\x2E\xF3\xFD\xF0\x93\x1E\xC6\xF2\x6E\xF3\xFB\xF2\xC6\xF3\xC9\xF2\x1C\xA0\xB9\x68\xF7\xF3\x02\xF4\x06\xF1\x04\xF4\xC1\xE4\x78\xF3\x9A\xF2\xA6\xF3\xBB\xF3\xFF\x00\x7E\xBD\xA0\xF3\xF3\xF3\xF9\xF3\xDE\xF0\x32\x06\xDF\xF2\x99\xE5\xE1\xF2\x90\xF3\x9C\xE5\x84\xF3\xC7\xF3\xE3\xE4\x46\xA0\x0C\xF4\xF4\xF3\x1B\xF4\x38\xBC\xAC\xE5\xD0\xE4\xE3\xF2\xFC\xF2\xBE\xF2\xC0\xAB\x40\xBC\xBE\xF3\x44\x09\x0D\xF4\xDB\x6E\xFB\xF3\x98\xF3\x86\xD4\x9A\xF3\xB0\xF3\xC1\xE5\x9D\xF3\x4A\x72\x25\xF4\x19\xF4\xE8\xF0\xDD\x05\x03\xF3\xED\xBC\x6F\xF3\x2D\xF4\x10\x6A\x3C\xF4\x35\xF3\x03\xF4\x27\xF4\xAD\xF3\x61\xBC\xB4\xBD\x07\xF4\x21\xF4\x09\xF4\xAB\x8D\xB4\xF3\x17\xF4\xD5\x08\x32\xF4\xFB\x95\x34\xF4\xFC\xE5\x97\x68\x6C\xBC\xC4\xF3\xD5\xF2\x08\xF4\x1B\xF3\xD4\x8D\x45\xF4\xCE\xF2\xE4\xB0\x0F\xF4\x56\xF4\xF2\x69\xC3\xF3\x2A\xF4\xEF\xF2\x4D\xF4\x5C\xF4\x2A\xF3\x03\xE6\xF2\xF3\x52\xF4\x26\xF4\xEE\x05\x31\xF3\xE9", "\xE7\x96\xA0\x18\xF4\x46\xF4\x0E\xF4\x32\x06\x38\xF3\x96\xD2\x6B\xF4\x31\xF4\x6D\xF4\xDD\x05\x23\xE6\x40\xF3\x0E\x9A\xF8\xF3\x73\xF4\x33\xF4\x93\x1E\xE1\xF3\xFA\xE4\xE3\xF3\xEF\xF3\x5D\xF3\xFF\x00\x38\xE0\xBB\x99\x08\x00\x67\x75\x80\x02\x5C\x0A\x3B\x00\xE6\x97\xCA\x20\xA3\x4A\xCF\xD0\xBC\xB7\x3C\x00\x6A\xE1\xE6\x65\x8B\xF4\xF0\x6C\x80\x02\xAD\xA0\xCA\x61\xED\x95\xC0\xD0\x7D\xE1\x84\xF0\x5C\x0A\xE8\xE0\x99\xF4\x23\x02\x8E\xF4\x90\xF4\xB7\x18\x92\xF4\x42\xE0\xF0\xEC\xD0\x14\x96\xF4\xB9\x69\xA2\xF4\xE1\x75\x9A\xF4\x1B\x9F\x9C\xF4\x4A\xF3\xE6\xF3\x9B\xBC\x04\xE6\xEE\x72\xF9\xE5\xF5\x72\x33\xB1\x97\xE4\x44\xAC\x2D\xF4\x19\xC2\xF1\xF3\x57\xF3\xB7\xF4\xBA\xE5\x08\xAC\x86\xE0\xB4\xF2\x1D\xF3\xC8\xE4\xBF\x02\x73\x6C\x8F\xE0\x2C\x67\xFC\xF3\x13\xF4\xFE\xF3\x91\xAB\xC7\x90\xEC\x72\x0A\xE6\x96\xAB\x80\xAB\xA9\xAB\xB2\xBD\x78\xE5\x25\xF3\x49\xBC\xE4\xF2\x55\xC2\x7D\xE5\xF1\xCF\xC1\xF4\x20\xE6\xC3\xF4\x7E\xE0\xD5\xF4\x77\xF3\x3D\xC2\x86\x8D\x42\xF4\xCA\xBC\xD0\xF4\xC9\xF4\xE4\xAB\xCB\xF4\x98\xE5\xB2\x71\x8F\xF3\x41\xE5\x91\xF3\x67\xF4\x66\xF3\x24\xF4\xFF\xE4\xD1\xF4\x2C\xE6\x95\xE5\xC5\xAB\xE1\xF4\xFD\xAB\x62\xF4\xC9\xAB\xEE\xF4\xAE\xA5\x06\xF3\x58\xBC\x75\xC2\x69\x70\xE8\xF4\xD2\xF4\xF8\xF4\xD4\xF4\xFA\xF4\xDE\xBC\x9C\xBD\x14\xBC\xFE\xF4\x26\xF3\xF1\xF4\x70\xF3\x9E\xF3\x03\xF5\xF6\xF4\xC4\xA4\x16\xAC\x40\xF4\xBA\x9C\x38\xF4\xD0\xE5\x43\xF4\x6C\xA0\xDD\xF3\xCF\xE9\xCC\x69\xF5\xF4\xB8\xF4\x32\xB1\x09\xAC\xB2\xBD\xDD\xE5\x59\xF4\xFF\xF4\x64\xBC\xA0\xBD\x50\xF4\xDD\xF4\xEF\xE0\x04\xF5\x8A\xE0\x90\xE0\xB0\xBC\x58\xF4\x65\xF4\xC5\xF3\x0D\xF5\x18\xF5\x7E\xA5\x10\xF5\x1E\xF5\x7D\xE0\x06\xF5\xD7\xAB\x23\xF3\x1F\xE5\x16\xF5\xDA\xF4\xC2\xE5\x7E\xBC\x6A\xF4\xC0\xF4\x29\xF5\x11\xF5\x73\xAB\xC4\xF4\x8C\xC6\xD5\xBD\x09\xDD\x5C\x0A\x1D\xF5\xC2\xF4\xB9\xF4\x26\xAC\xD6\xF3\x1F\xD1\x41\xF5\x35\xF5\x89\xE0\xBA\xF4\x27\xAC\x7D\xF4\xAE\xA6\x49\xF5\xDF\xF4\x4B\xF5\x86\xE0\x83\xF4\xD8\xF4\x6C\x95\xA1\xC2\xDE\xAC\x50\xCC\xBC\xB7\x3D\x00\x02\xF1\x4D\xC5\x85\x60\x30\x01\x18\xD1\x29\xAD\xE7\xF3\x4D\xF3\x46\x0A\xDD\xA9\xD4\x6F\xBB\xF4\x4E\xE5\x86\xF4\x9B\xE4\x56\xF3\x93\xD2\x5C\x0A\xE0\x72\x81\x8D\x6C\xF5\x5A\xE5\x61\xC2\x74\xF5\x58\x9A\x5E\x29\xCC\xF4\xE6\xF4\x55\xC2\xC0\xF2\x51\xF4\xD7\x04\x6B\xF5\xB3\x33\x05\xF4\xC1\x90\x7D\xF5\x3D\xF5\xDC\xF4\x30\xF4\x8E\x07\x82\xF5\x04\x42\xD1\xF2\x08\x61\xD3\xF2\x23\xF5\x0C\xF5\x00\xF5\x7F\xC2\x1C\x72\xC7\x90\x79\xF5\xDD\xB1\x7B\xF5\xEC\xF4\x34\x93\xFD\xF4\xB3\xA0\x30\xF5\x92\xF5\xD2\xBC\x95\xF5\x8B\xF5\x12\x43\xEC\xF2\x1E\xF4\xEF\xF4\x20\xF4\x9E\xF5\xA0\xBD\x2F\xF4\x54\xF2\x5F\x66\x67\xF1\xEE\x05\xBD\xE5\x99\xF3\xFA\xF2\x9B\xF3\x39\xF4\xB2\xF3\x0F\xF5\xFF\xE4\x96\xF5\xFC\xB1\x98\xF5\x49\xF4\x57\x02\x04\xF3\x90\xF5\xD9\xF4\x2C\xF4\x70\xBC\xA9\xF3\x80\xF5\x8A\xF5\xAC\xF5\x3F\xF4\x21\xF5\xAF\xF3\x5B\xF5\xFB\xE4\xBE\xF5\x55\xC2\x27\xF5\x89\xF5\x6A\xF5\xC3\xF5\x00\x06\x2D\xF5\x10\xE5\xC7\xF5\x12\xE5\x70\xBC\xBD\xF3\xAA\xF5\x13\xE1\xCE\xF5\x40\x01\xB0\xBC\x64\xF4\x82\xF3\x2B\xF4\x5B\xF4\xF2\xF4\x3E\xF5\xB9\x69\x33\xF3\xC2\xF5\x98\xAA\x04\x42\x6F\xF4\xAC\xE6\xE2\xF5\xCD\xF5\xE4\xF5\x12\x43\x76\xF4\xF7\x8E\x71\xF4\xD7\xF5\xEA\xF5\xEB\xF3\x49\x6B\xE1\xBD\x0E\x9A\xB6\xF5\x1B\xB2\x5E\x29\x5A\xF5\xBC\xF5\x5C\xF5\xB1\xA0\x6F\xF5\xAF\xDC\x6D\xEB\x8C\xA7\x42\x6A\x17\xE1\xC9\xCB\x4C\xD8\x70\xE9\xBA\xEF\x58\xDF\xA8\xEF\xAE\xE9\xAA\xEF\xB0\xE9\x5D\xDF\xAD\xEF\x15\xCD\xDA\xBE\xB8\xED\x0D\xD4\x0E\xEB\x44\xE2\x70\xDD\xAC\xE1\x4C\xE8\x13\xEB\x4E\xE8\xCD\xDC\xA3\xED\x2D\xF2\x71\x6D\x01\xF6\xB0\xCB\x64\xEF\xE5\xE9\x74\xEE\xD4\xEF\x27\xED\x92\xDF\x45\xEE\x6C\xEA\x47\xEE\x35\xEC\x6F\xEA\x37\xEC\x40\xE2\x0F\xF6\x97\xD9\x2B\xD7\xAA\xE1\x13\xF6\x6F\xCC\xBE\xED\x06\xBF\x19\xF2\xC1\xED\xD1\xE1\x03\xBA\x1C\xF6\x2B\xC9\x02\xF0\xE3\xEC\x7C\xEF\xE5\xEC\x06\xF0\xB0\xEE\x3C\xF0\xE9\xEC\x3E\xF0\xD8\xEC\x40\xF0\xDA\xEC\x86\xEF\x01\xDD\xD2\xB1\xED\xF3\xD5\xB8\xA5\xD3\xC9\xD6\x28\xC9\x95\xE3\x37\xF6\x43\xC9\xBF\xEE\x58\xEC\xBB\xEF\xD4\xE9\xF9\xE2\xD6\xE9\xFB\xE2\xD8\xE9\xFD\xE2\xDA\xE9\x75\xEC\x1E\xD0\x81\xF1\x10\x04\xFB\xD9\xC6\xCC\x9A\xE8\x0E\x93\x4E\xF6\x91\xE9\x50\xF6\xEA\xEE\x60\xEE\x33\xE9\xD9\xEE\x3F\xF6\x44\xED\x41\xF6\xEB\xEC\x43\xF6\xED\xEC\xD2\x83\x5A", "\xEB\x35\xEF\x15\x09\x43\xF0\x9F\xC7\x35\xF0\xFE\xE8\xEB\xEF\x21\xF6\x20\xF0\xE6\xE2\xD7\xEF\x3E\xE4\xD9\xEF\x40\xE4\x5C\xDE\x42\xE4\x7D\xE3\x95\xE8\x58\xDD\xC4\xE8\x20\xBE\xCB\xEC\xCD\x0A\x73\xF6\x58\xC7\xE9\xEF\xB6\xE8\xBC\xEC\x3B\xF6\x13\xEF\x93\xEF\xE5\xED\xCE\xED\x21\xEC\xD0\xED\x02\xEA\xD2\xED\x22\x82\xF4\xEA\x32\xEE\x9A\xB8\x34\xEE\x1E\xCD\x73\xDD\x75\xDD\x88\xEE\x57\x04\x88\xF6\xE0\xCA\xD2\xEF\x25\xED\x78\xF6\xAF\xED\xA0\xE3\x78\xEE\xA2\xE3\x24\xF0\xA6\xE2\x26\xF0\xA6\xE3\x28\xF0\x67\xD4\xBE\xDD\x32\xA2\x59\xDA\x9D\xEB\x50\xEE\xD5\xD1\xF3\xE8\x4A\xD4\xFA\xCF\x54\xEE\x7F\xE9\x0C\x03\xA0\xF6\x78\xC9\x75\xF6\x24\xEA\x77\xF6\x1F\xF0\xA5\xF6\x5D\xED\xA7\xF6\x8F\xE8\xA9\xF6\xA4\xE3\xAB\xF6\x93\xE8\x81\xF6\x9A\xC3\x5D\xCD\xB8\xEB\xF1\xED\xA7\xDD\xD6\xBF\xCC\xEF\xC4\x0A\xBB\xF6\xC0\xCA\x3A\xEF\x7A\xEF\x03\xF0\x38\xF0\x12\xEE\x3A\xF0\x42\xED\x69\xF6\x16\xEE\x6B\xF6\x46\xED\x6D\xF6\x48\xED\x9B\xEE\xF7\xEF\x3C\xB6\x24\xE9\x52\xEE\xFD\xEF\x87\xEE\xF8\xE3\x9F\xF6\x02\xF6\x4A\xD9\x25\xEF\xA5\xEF\xFF\xEE\xA7\xEF\x14\xDB\xA9\xEF\xA1\xD5\xAB\xEF\x6A\xCF\x5E\xDF\xB7\xCD\x60\xDF\xB2\xEC\x3B\xE9\xE8\xEB\xFC\xC9\x12\xC7\x80\xDF\x9C\xCD\xA0\xEE\x6C\xAE\xEF\xEB\x5B\xEB\x62\xF6\xF2\xE9\x09\xCA\xE1\xEC\x3B\xEF\x3C\xE8\xD7\xF6\x27\xEE\xD9\xF6\x14\xEE\xDB\xF6\x2B\xEE\xDD\xF6\x18\xEE\xDF\xF6\x1A\xEE\xC3\x89\x02\xEC\xB9\xE9\x5C\x0A\x03\xF7\x32\xEA\x64\xF6\xF8\xEC\x3E\xEF\x14\xEF\xFB\xEC\x16\xEF\x5E\xEC\x18\xEF\xAB\xE8\xEA\xED\x59\xDB\x21\x99\xCC\xEE\xA4\xEE\x87\xF6\xEA\xF6\xE0\xDA\xAB\xEE\xFD\xED\x06\xF6\xF0\xF6\x08\xF6\xF2\xF6\x0A\xF6\xAC\xEF\x44\xEA\x35\xDE\x46\xEA\x45\xCA\x53\xC7\x4D\xF6\xD2\xF6\x1F\xC7\xD4\xF6\x65\xEF\x7B\xEF\x04\xF0\x3C\xF6\x0B\xF7\x29\xEE\x0D\xF7\x96\xEE\x0F\xF7\x2D\xEE\x11\xF7\xC5\xE2\x7F\xED\x05\xDB\xD5\x9D\x3E\xEC\x4E\xC4\x57\x0A\x38\xF7\x96\xCA\x1E\xF6\xC0\xEB\x20\xF6\xC0\xF6\x76\xEE\x45\xDE\x06\xEB\xE7\xE8\x7A\xEE\xE9\xE8\x7F\xF6\xEB\xE8\x4C\xDE\x19\xE3\xEF\xF1\xA4\xED\x16\xF7\x4D\xF7\x05\xF7\xF5\xEC\xAC\xED\xCF\xDA\xEC\xEF\xEB\xEE\x67\xF6\xED\xEE\x65\xEB\xEF\xEE\x43\xF7\x98\xEE\xF4\xEF\x9A\xEE\x5B\xEF\x91\xE9\x2F\xE3\x19\x8B\xB0\xE8\xE9\xF6\x1D\xF6\x72\xEE\x3B\xF7\xD6\xF6\x65\xF7\x66\xF6\x63\xEB\x62\xEE\x69\xF7\x56\xEF\x6B\xF7\xB4\xEE\x6D\xF7\xB6\xEE\x44\xD0\xD5\xC0\x42\xE3\x65\xCE\x17\xF7\xEA\xC9\x19\xF7\x3D\xEF\x41\xC6\x1C\xF7\x78\xED\x1E\xF7\xAE\xEC\x20\xF7\xBF\xE8\x99\xEF\xD3\xED\x71\xEF\x8D\x63\xF1\xC0\xC4\xB6\x87\xF7\x08\xCA\x89\xF7\x8D\xF6\x1B\xF7\x8F\xF6\x15\xEF\x91\xF6\xE7\xED\x93\xF6\x24\xEB\x95\xF6\x04\xEA\x9B\xEF\xB5\xD8\x5D\xEF\x6D\x9E\x92\xA9\x98\xF7\xB5\xD8\x9A\xF7\x3D\xF7\x8E\xF6\x3D\xF6\x7F\xEF\x41\xF7\xB2\xEE\x7F\xF7\xF1\xEE\x45\xF7\xCA\xEE\x83\xF7\x06\xEA\xB5\xEC\x86\xF7\x60\xF7\xAC\xF7\x09\xF7\x92\xEE\x3F\xF7\x94\xEE\xB1\xF7\xC6\xEE\x65\xEE\xC8\xEE\xB5\xF7\xDF\xEE\x5D\xD0\xA2\xD8\x88\xEF\xA4\xD8\x97\xF7\xBB\xF7\x4F\xEF\x8C\xF6\xAD\xF7\x9C\xF7\xAF\xF7\x94\xEF\xC1\xF7\xDB\xEE\xC3\xF7\xDD\xEE\xC5\xF7\xF3\xEE\x42\xF0\xD2\xBD\xAF\xDB\x36\xF6\xCC\xF7\x39\xF6\x57\xEC\x65\xF6\xD7\xEE\x67\xF7\x54\xEF\x7D\xF7\x09\xF0\xD5\xF7\x83\xEF\x81\xF7\x85\xEF\xD9\xF7\x1C\xB4\xE3\xB4\xC1\xD5\x27\xF7\x75\xF7\x3A\xF7\x1F\xF6\x66\xEF\xA4\xF6\x53\xF7\x8D\xE8\xC3\xF6\x5F\xED\xC5\xF6\x91\xE8\xC7\xF6\x70\xEA\xAD\xF6\xBE\xCB\x5C\xEA\x83\xEE\xA8\x0E\x4B\xB4\xDD\xD5\xED\xEB\x18\xDF\x20\xED\x72\xF6\x28\xF7\x0E\xDB\xB9\xEF\xAC\xEE\x52\xF6\xED\xDD\xD5\xE9\x10\xDC\xD7\xE9\xC7\xD8\xD9\xE9\x0F\xDA\xDB\xE9\x7E\xD0\x2D\xDF\xF9\xEF\x02\xD9\x90\xAA\x92\xC1\xF3\xE3\xCD\xF6\x85\xDF\xF6\xE3\x83\xB9\xAA\xF7\x70\xDB\x4E\xF7\x76\xF7\xF1\xF7\x3C\xF7\xBD\xF7\x05\xF0\xBF\xF7\xC4\xEE\xD3\xF7\x81\xEF\xE6\xF7\x0B\xF0\xE8\xF7\x0D\xF0\xB1\xC8\xAF\xF6\x32\xED\x34\xB8\x1A\xB8\x35\xED\x61\xD9\x37\xED\xAB\xEA\xE6\x65\x1F\xF8\x61\xDE\x21\xF8\xF0\xF7\x50\xF7\xF2\xF7\x52\xF7\x68\xEF\x77\xEE\x55\xF7\x79\xEE\x08\xEB\x7B\xEE\x6E\xEF\x7D\xEE\xF5\xEF\x0E\xF0\xBF\xEA\x10\xF0\x58\xEE\xD2\xC1\x31\xCF\x6B\xED\xCE\xF6\xAA\xEA\xF1\xEC\x34\xD7\x4C\xF7\x07\xF8\x62\xDB\x90\xED\x4A\xE3\x43\xEE\x6A\xEA\x8A\xE3\x25\xF6\x7D\xF6\x48\xEE\x59\xF7\xA3\xE9\xC9\xF6\x4C\xC5\x0F\xF0\xE5\xD8\x47\xE4\x5C\xB8\xFF\xF6\x62\xD9\x79\x0A\x8B\xEF\x5F\xF7\x55\xF8\x47\xDC\x57\xF8\x2F\xEC\x59", "\xF8\x31\xEC\x5B\xF8\x33\xEC\x6D\xEA\x27\xF6\xFA\xF7\x29\xF6\xFC\xF7\x39\xEC\x2D\xE3\x20\xF8\xA9\x9B\xF7\xEF\x68\xCE\xD9\xEA\xDD\xCB\x68\xE4\xB5\xD0\x4A\xF0\x82\xD9\x6C\xE4\xF0\xD2\x74\xE0\xA2\xA5\xD6\x21\x51\xF0\xFE\xF7\xF1\xE8\x89\xED\x28\xF5\x7D\x02\x0E\xF6\xAF\xF1\x10\xF6\xBA\xED\xD7\xE8\x45\xE2\xA0\xCF\x9F\xED\x16\xF6\xA1\xED\xB0\xE1\x19\xF6\xE1\xE9\xFB\x69\x2F\xE1\x3D\xDA\x9B\xED\xC8\xE1\xE6\xDC\x9E\xED\x04\xBF\xA9\xD6\x97\xDB\xF7\xD3\xB5\xCF\x8E\xF8\x22\x03\x34\xF7\x0F\xC9\x1E\xD3\xD4\xB8\x34\xC6\xE8\xE1\x33\x7D\xD9\xB1\xC1\xF5\x0D\xBE\xAF\xEF\xD2\xD9\xDD\xD6\x53\xC6\xDF\xD6\x44\xEB\x4F\xF8\xD7\xD9\xF3\xED\x30\xDD\xA0\xF4\xBA\x01\xAB\xF8\xF8\x7F\x70\xF6\x04\xD1\x9D\xF8\xC1\xF8\x14\xEB\x6F\xF1\xFE\xF5\xB6\xF2\xC5\xF8\xC5\xE1\xFA\xD3\xC7\xE1\x11\xF6\x2E\xF6\xBC\xED\x71\xDD\x9B\xF6\xCA\xE9\x13\xD4\x1C\xC5\x71\xD0\x9E\xF8\x71\xEA\xBB\xED\xE2\xF6\x5E\xE2\xE4\xF6\xDE\xDD\x62\xE2\x66\x90\xCB\x69\xD8\xF8\x78\xF8\x57\xDD\xF0\xF4\x78\xE2\xB2\xEF\xCF\xF6\xA0\xD0\xE6\x65\xE2\xF8\x61\xF8\xA9\x84\x9B\xEB\x27\x0E\x82\xEE\x9E\xEB\xCF\xEF\xA0\xEB\x5E\xDA\x89\xD7\xE1\x92\xD6\xF8\xA9\x67\xEB\xF8\x7E\xEE\x94\xB9\xFA\xF6\x86\xD4\xFC\xF6\xFF\xF7\xFE\xF6\x14\xF0\xD9\xE3\x57\x9D\xB3\xDA\xB6\xF4\x00\x62\xB5\xF8\xF7\xDD\xB8\xEE\x04\xA9\x7E\xE1\x9B\x03\xC6\xF8\xBB\x6D\x25\xF7\x05\xF9\x8F\xF8\x07\xF9\x8E\x75\xE1\xEE\x9C\xF8\xCC\x69\xF9\xF8\x48\xF8\xD9\xB6\xB1\xEF\xFA\xCD\x93\xE9\x4A\xF7\x84\xDC\xC0\xF8\x09\xEF\xD4\xBD\x52\xEC\x61\xC2\x17\xF9\x6E\xF7\xEA\xF7\x1D\xEF\x3C\x0F\xB8\xE9\xCD\xCF\x24\xF9\x82\xF7\x48\x80\x77\xDE\xE0\x99\x2B\xF9\xE9\xF7\x2D\xF9\xDD\xE9\x4A\xEF\xAE\xA6\x30\xF9\x2E\xF8\x5F\xDE\x7A\xF8\x3A\xF8\xCA\x66\x6A\xE3\x2A\xF9\x0D\xF9\x99\xF8\x71\x0F\x73\xEF\xE7\xD0\x1F\xF9\x31\xEF\xAA\xD6\xC8\xF7\xC9\xEC\x89\xEF\x23\xF9\x3E\xF9\x6F\xDC\xF9\xBA\xAB\xE3\x1A\xB4\x35\xF9\x4A\xF9\xC3\xDB\x4D\xDF\x4A\xEA\x7E\xE5\xF8\xF8\x3E\xF9\x4A\xE0\xB3\xF6\xF3\x73\x96\x0E\x30\xBB\x01\xF9\x6E\xD0\x04\xF8\x94\x6A\x5C\x0A\x36\xF9\x41\xF0\x2F\xF8\xBD\xBD\x05\xB1\x8B\xEA\x2F\xDF\x03\xD9\x19\xF8\x76\xEA\xFB\xDE\xE3\xEF\xC8\xF1\x43\xF9\x00\xEC\x78\x8C\x66\xED\xF1\xF8\x1B\xD3\x11\xE4\x1E\xDC\x67\xF8\x36\xF8\x52\xF8\x60\x69\x60\xF9\x56\xF9\x2A\xF0\x15\xBD\xA7\xEE\x61\x90\x13\xF0\xBB\xF8\x7A\xDA\xD6\xC1\xF7\xF8\xEA\xF8\x7B\xF9\x71\xF9\x58\xF9\x81\xF8\xB3\xBD\xB6\xC8\x99\xDA\x68\xF8\x6E\x6E\x75\x90\xAA\xF8\x12\xF9\x61\xCA\x48\xEA\xD2\x75\x45\xF0\x78\xDC\x30\xD4\x53\xE7\x82\xF8\x85\xED\x4B\xF0\x87\xED\x29\xA6\x01\x0B\x83\xBE\x84\xF0\x03\xA0\x68\xBE\xE8\x8A\x7D\xBE\x4A\x11\x17\x48\x57\x3A\x2B\x69\xF0\x06\x9F\xF9\xC4\xD0\xA1\xF9\x5A\xBE\x81\x8B\xA4\xF9\x38\x14\x94\x43\xA7\xF9\x16\x65\x50\x06\xAA\xF9\xD2\xCF\xAC\xF9\x9C\xED\x1F\xA9\xAF\xF9\x63\x73\x8E\x03\x57\x3A\x88\xF1\x6C\xB1\x99\xF0\x2F\x06\x69\xE6\x18\xE7\x51\x01\x91\xE6\x34\x78\x82\x73\xA4\xD5\x33\x00\xBB\xE6\x95\x59\xAC\x66\x43\x00\x91\xE6\x71\x00\x0C\xBE\xCF\xF9\xF7\x75\x64\xE1\x00\x00\x87\xBE\xBB\x91\x68\xE1\xA2\xEE\xAC\xF4\xF6\xCB\x09\xE4\x4F\xE1\x6E\xE1\xA9\x8B\x15\xE8\x12\x78\x41\x00\xC2\xF9\x68\xE7\x6C\x89\xC5\xF9\x0C\xBE\xC8\xF9\xCA\xF9\x79\x48\xCC\xF9\xCE\xF9\xD0\xF9\x78\x75\xD3\xF9\xD5\xF9\x30\x92\xD7\xF9\xA1\x10\xD9\xF9\x4B\xF1\x79\xE9\xDC\xF9\x58\x01\x4C\x8A\xED\xE0\x50\xBD\xE0\x99\x94\xE1\xC5\xED\xBD\xEE\x2E\xD1\x48\xF0\x98\xE4\xE7\x73\x79\xAB\xCD\xE0\xFC\xF9\xDD\xED\xA8\xED\x2E\xD1\x77\xF5\xB5\xF3\x05\xFA\xF7\xED\x07\xFA\x19\x27\x7C\xF5\x4C\xF4\xA7\xF5\x7B\xF3\xFF\x00\x7F\xF5\xA9\xF8\x16\x06\x73\x6C\xD7\xD0\xB8\xF3\xB9\xF5\xB7\xE4\x06\xF4\xB1\xF5\x17\xF5\x70\xBC\x88\xF5\xD6\xF5\x27\x05\x17\xFA\x16\xD1\x49\x6F\x19\xFA\x5A\xA0\xC2\xE4\x1D\xFA\x3C\xF5\x3A\xF4\x7C\xF3\x00\xF4\xE6\x65\x0B\xFA\x0C\xEE\x8F\xE1\x7E\x4A\x1C\xF4\xED\xF4\xA4\xF5\x0B\xF5\xBD\xF5\xDE\xF5\x0E\xF5\xA0\xE5\xC7\x90\x2F\xFA\x30\xF0\xCD\xD0\x9E\x25\xA3\xF5\x0A\xF5\x9C\xF5\x5A\xF4\x31\xF5\x70\xBC\xA9\xF5\x45\xF2\xE8\x01\x23\xFA\x39\xD1\x62\x32\xAE\xF5\x36\xF4\xB0\xF5\x3B\xF5\xC9\xF5\x3D\xF5\x9F\xF3\x15\xFA\x20\x07\x49\xFA\xC0\xE0\x4B\xFA\xB2\xBD\xCE\xE5\x29\xFA\x50\xFA\x2B\xFA\xA7\xAC\x3B\xFA\x55\xFA\x31\xFA\x25\xFA\x0E\xF3\x4B\xF4\x5A\xFA\x38\xFA\x32\xF5\x76\xC2\x2D\xFA\xB9\x69\x3C\xFA\x3F\xF1\x4D\x6F\xD0\xF5\xEE\xE5\xD2\xF5\x7A", "\xE5\xD4\xF5\x5E\xFA\x00\xF0\x3F\xFA\x39\xF5\x13\x75\x86\xF5\x5C\xFA\xC9\xF3\x47\xF5\x48\xFA\x73\xFA\x32\x6F\x83\xF6\x46\xF5\xE8\xF5\x6A\xFA\x4C\xF8\x3E\xFA\x32\x6F\x4D\xF5\x1E\xF9\xD4\x72\x7C\xFA\xC1\xE0\x6C\xE0\x54\xF5\x93\xAB\x81\xFA\x6F\xEE\xF5\xE4\x62\x32\xF8\xF5\x2F\xF5\x4C\x6E\x5D\xF5\x49\xF3\xD9\xD0\x0C\xF1\xC1\xE7\x37\xF1\x07\x01\x73\x6C\x82\xED\xBE\xF9\x9D\xFA\x7F\x83\x40\x10\x8A\x0F\x7B\xE7\x1A\x86\x0F\x65\x53\xE6\x9F\x44\x3A\x0B\x46\xF9\x71\x0F\x89\xF4\x0B\xF9\x32\x7C\x73\x6C\xA9\x5E\x9B\xF2\xD3\xE7\x9D\xF2\x98\xF1\x6A\xAC\x06\x01\x9B\xF1\xCB\x77\xB2\x17\xAD\xFA\x0C\x65\xA8\x03\xAF\xFA\x1D\xE2\xB1\xFA\x4B\xF2\x84\xF2\xA0\xF2\x86\xF2\xEB\xF1\x5B\xA6\xAA\xF1\x79\x01\xDF\xE0\x50\x52\x9E\x0B\xD6\xF1\x2E\xF2\xD8\xF1\x7C\x1D\x9E\x38\xB4\xF1\xE0\x51\x0E\x9A\x4C\xE6\x21\x65\xAE\xFA\x64\xF2\xCE\xF1\x82\xF2\x75\xF2\xBF\xFA\x4D\xF2\xC2\xF1\xA1\xF2\x93\xF2\xC9\x71\xC6\xF1\x25\xE6\xFB\x69\xD1\xFA\x20\x65\xD3\xFA\x8D\xF2\xD5\xFA\x8F\xF2\x9E\xF2\x25\xF2\x19\x65\x5D\xF2\xE1\xDF\xC9\xFA\x00\xA6\xCB\xFA\x46\x2A\x9E\x38\x22\xD1\xDD\xF1\xAE\xA6\xE1\xFA\x1F\x65\xE3\xFA\x49\xF2\x8E\xF2\xCA\x14\x90\xF2\xD9\xFA\xE9\xF1\x2F\xE8\x8F\x79\xEE\xF1\xD0\xFA\xB8\xFA\x46\xE6\x3A\x0B\xBB\xFA\x11\xF1\x23\xF2\x9E\xF2\x64\xF1\x48\xD1\x23\xA7\x10\xE1\x29\xA6\xFD\xF1\x93\xAB\xF4\xFA\x1E\x65\xF6\xFA\x58\xF2\xF8\xFA\x94\x16\xFA\xFA\xA5\xF1\xD3\xF1\x09\xF2\x16\x65\x39\xA6\x00\xFB\xD2\xFA\xB9\xFA\x4F\x0B\xD4\xFA\x9C\xF2\x13\xF2\xE7\xFA\x85\xF2\x55\xF1\x6D\xF1\xC3\xE8\x1B\xF2\x8F\xF9\x99\x3B\x01\xFB\x0B\x51\x55\xE6\x1E\xFB\xE4\xFA\x20\xFB\x06\xFB\xD7\xFA\x9F\xF2\xFB\xFA\x17\xFB\x28\xF2\xC4\xFA\x64\xF3\x4C\x1F\x2B\xF2\xE0\xE0\x1D\x01\xEC\xFA\x8C\xA7\x2F\xF2\x64\xA6\x49\x2B\x41\x7C\x3A\xFB\x1E\x06\x43\x7C\x27\x01\xFF\x9A\xCC\xF5\x0F\xFB\x3B\xE0\x1D\xFB\xF8\x9D\x12\xFB\xE5\xFA\xF9\xFA\x22\xFB\xC0\xFA\x24\xFB\xA2\x7C\x79\xA6\x43\xF2\x1B\xFB\xE2\xFA\x4A\xFB\xD4\x81\xAF\xF0\x2F\xFB\x74\xF2\xBE\xFA\x32\xFB\x16\xFB\x17\xF2\x6A\xF2\x8B\xA6\x52\xF2\x55\xFB\xF5\xFA\x57\xFB\x04\xFB\xB9\xE7\x30\xFB\x5C\xFB\xE8\xFA\x5C\xF2\x27\xF2\x6A\xF2\x9C\xA6\x60\xF2\x0E\xFB\x2A\xFB\x51\xF1\x56\x0B\x66\xFB\x81\xE5\x21\xFB\x31\xFB\x6A\xFB\x47\x0F\xEA\xFA\xD0\xF0\x6B\xF2\x06\x01\x6D\xF2\x61\xC2\x48\xFB\x48\xE0\x65\xFB\x1F\xFB\xB0\xFA\x76\xFB\x5C\xFB\x08\xFB\xA3\xF0\x0A\xFB\xD4\x64\x8C\x7C\x7A\xF2\x06\x01\xA5\x7C\x47\xFB\x71\xFB\xC5\x7D\x2C\xFB\x4B\xFB\x72\xF2\x59\xF2\x09\xA7\x56\xA6\x09\xFB\x54\xF1\xA5\xF0\xC2\xFA\x25\xFB\xE9\x7C\x27\x01\xE2\xDF\x21\xFA\x29\xFB\x1C\xFB\x02\xFB\xBA\xFA\x83\xFB\xBC\xFA\x85\xFB\x5A\xF2\x97\xFB\x88\xFB\x99\xFB\xF0\xF0\x9B\xFB\x9F\xFB\x8F\x79\x95\xF2\x70\xFB\xA2\xFB\x2B\xFB\x73\xFB\xA5\xFB\x05\xFB\x5B\xFB\xA8\xFB\xA4\xF1\x0E\xE1\x3F\xF2\xC1\xFA\x6C\xF1\xAE\xFB\x9E\xFA\x0F\x8E\x28\xF1\x02\x01\x0C\xE7\xD8\xF0\x2B\xF6\xA9\x04\xFD\x5F\x10\xE7\xD1\x63\x3E\xEE\x75\xF0\x3F\xF3\x9B\x10\x77\x91\xB9\x44\xD7\xF3\x47\x66\x5F\xFA\x61\xEF\x82\x5F\x49\x02\x16\x65\x9A\x6E\xF9\x08\x5A\xF1\x8C\x6E\x04\xE2\xAC\xE7\x37\x91\x2F\x59\xF2\xE6\xDA\x45\x88\x6B\xDD\x99\x11\x3D\xCD\xE0\xD4\xE6\x54\xE8\x11\x93\xBF\xFB\xE8\xFB\xE9\xFB\xEA\xFB\x83\xF6\x10\x66\x47\x00\xD9\xFB\xF2\xF5\x16\x65\x77\x91\x48\x00\x30\xF1\x91\x5C\x73\x6C\x32\x9A\xEB\xFB\xEA\xA4\xE7\xB0\x63\x0A\xEF\xFB\x03\x8E\x9B\xDC\xCD\xE0\x9B\xE7\x90\xEC\x88\xDC\xF8\xFB\x03\xFC\x32\xE0\xC1\xFB\x48\x3E\x04\xFC\x2C\xF1\xBC\xB7\x4A\x00\x62\xF5\xE4\xD8\x8B\x34\xBC\xDF\xCA\x6F\x2C\xCC\x4B\x00\xDD\xE7\x75\xE1\x7C\x1D\x70\x55\xFD\x0B\x8A\x5F\x6C\x00\x11\xE7\x49\x02\x2C\xCC\xF6\x2C\x08\xFC\x96\xFA\x71\x0F\x08\xA6\x01\x01\x6B\xDF\x1F\x8E\xD3\xF9\x6F\x9A\x6E\xE3\x67\xDE\xB0\xDF\x42\xE5\x8E\x10\x35\x45\x4D\x00\xFC\xFB\xF5\x6F\x16\xF1\x95\x0F\xA8\xFA\xAC\x66\x4F\x00\x91\xE6\x17\x00\x1E\xF1\x87\xA1\x36\xFC\x8D\xBE\x54\xE7\x88\x46\xBB\xE6\xF7\xFB\xEE\xDF\xE1\xEA\x9B\xF8\x60\xE7\x72\x78\xF6\xFB\x6E\x60\x15\x4A\xA9\xEE\x8A\xF6\x01\xEB\x64\xF7\xF3\xF7\x40\xF8\x54\xF7\xEF\xEF\x07\xEB\xF1\xEF\x09\xEB\xF3\xEF\x0B\xEB\x80\xEB\x0D\xEB\x93\xF8\xF5\xEA\x23\xAD\x69\xD3\xE2\xBE\xD4\xF8\x8C\xD6\xC9\xF8\xFC\xAD\x2F\x00\x44\xFC\x92\x5B\x47\x58\x78\xEF\x06\xF7\xD5\xF6\x3A\xF6\xCF\xF7\x8B\xF7\x9D\xF7\x1D\xF7\x9F\xF7\x17\xEF\xA1\xF7\x23\xEC\x1A\xEF\xD3", "\x52\x97\xF6\x0F\xEB\xC8\xDC\xB9\xD9\x69\xD3\x25\xAD\xBF\xED\xA7\xF8\x6E\xE8\x95\xE3\x5F\xFC\xA6\x86\x5C\x02\x62\xE7\x1B\xF0\x7D\xC5\xF6\xEC\x08\xF7\x79\xF7\xE1\xF7\x7B\xF7\x68\xF6\xE4\xF7\x3D\xF0\x2B\xF8\x3F\xF0\x2D\xF8\x62\xF9\xB9\xCF\x32\xC6\x28\xBF\x49\xF6\x5F\xEA\x27\xC9\xB2\xF8\x86\xF6\x7B\xFC\xBB\x9D\x7D\xFC\x62\xFC\x7F\xFC\xFB\xD1\x63\xF7\xA1\xDB\x97\xDD\x23\xE2\xD3\xE2\xB7\xEA\xC4\xE9\x4C\xEC\x57\xEA\x45\xEF\xFF\xEB\x47\xEF\xE4\xF8\x43\x0F\xEE\xED\x4D\xBF\x05\xDD\x60\xF6\x92\xA9\x95\xFC\xD8\x9E\x97\xFC\x4D\x58\x63\xEF\x22\xF8\x3D\xF8\x24\xF8\x83\xFC\x52\xEF\xE2\xF7\x3B\xF0\x87\xFC\x40\xF6\x89\xFC\x42\xF6\x8B\xFC\x44\xF6\x6F\xF6\x94\xF0\xDF\xCC\xAD\xFC\x60\xFC\x89\x0C\x7E\xFC\xBC\xF7\xB6\xFC\x39\xF0\xB8\xFC\xDA\xF6\xBA\xFC\x6A\xF6\xBC\xFC\x6C\xF6\xBE\xFC\x6E\xF6\x32\xF9\xEE\x95\x68\x41\x2E\xFC\x7F\x83\x1D\xEE\xA6\xE9\x82\x0F\xC4\xFC\x61\xE7\x98\xFC\xC7\xFC\x4B\xFC\xED\xEF\x69\xEF\x7C\xF7\x0E\xEC\x6A\xF7\xCE\xFC\xDE\xF6\xD0\xFC\x3D\xA8\xA0\xF8\xCF\xF8\xC9\xE1\x95\xF8\x2E\xD7\xC8\xA1\x30\xD7\x45\xDB\x49\xE2\xD0\xF6\xEE\x0F\xDA\xFC\xC3\xDF\xDC\xFC\xCD\xF7\x0F\xED\xDE\xFC\x66\xF7\x85\xFC\x68\xF7\xE2\xFC\x7E\xF7\xE4\xFC\x10\xF7\xE6\xFC\x12\xF7\xFA\xC9\x4D\xEE\xF2\x69\xF0\xE8\x88\xF9\xF2\xF8\xB5\xF6\x50\xED\x91\xBB\xFF\x00\xB8\xF6\x5E\xF7\x77\x76\xF3\xFC\x8C\xA7\xC6\xFC\xF6\xFC\xAD\xED\xF8\xFC\x7A\xF7\x0C\xEC\xE1\xFC\x6B\xEF\xE3\xFC\x6D\xEF\x52\xFC\x6F\xEF\x25\xF9\xC7\xF7\xDD\xF5\xA4\xDD\x6C\xD7\xF4\xE8\x0A\xFD\x0F\xE9\xE4\xEF\xAA\x0F\x0F\xFD\x14\xDD\x10\xD2\xB7\xEF\x48\xFC\x2E\xEC\x9D\xFC\x30\xEC\x9F\xFC\x32\xEC\xB8\xEA\x34\xEC\xBA\xEA\x5F\xE4\xBC\xEA\x38\xEC\x67\xE8\xDB\xF8\xCE\xEB\xDD\xF8\x85\xEE\xE6\xF6\x83\xB9\xAE\xFC\x44\xE7\x54\xE7\x39\xEF\xD3\xEE\x77\xF7\x66\xFC\x25\xF8\x3E\xF7\xCA\xFC\x0C\xF7\xCC\xFC\xDC\xF6\xFE\xFC\x44\xF7\x00\xFD\x46\xF7\xE1\xF6\x68\xD4\xDC\xC3\xE9\xEB\x13\xD0\x72\xF9\x6D\xD4\x3B\xFD\x76\xF9\x19\xD0\x01\xF7\x71\xF6\x26\xFD\x7C\xFC\x40\xFD\x34\xF0\x4F\xF7\x4D\xEB\x51\xF7\x91\xED\x22\xF6\x54\xE2\x7B\xF6\x3A\xEB\xF8\xF7\xA1\xE9\x5F\xF8\x3E\xEB\xEC\xF8\x7D\x86\x14\xF7\xCD\xEE\xD9\xFC\x5C\xFD\xB2\xDB\x2A\xFD\xBD\xF6\x1B\xEB\xF7\xFC\x3F\xF8\xDF\xFC\x41\xF8\x4E\xFC\x56\xF7\x44\xF8\x58\xF7\x7C\xEE\x5D\xDE\xFA\xF8\x79\x8A\x15\xEC\x26\xD0\x65\xCE\x3E\xFD\x16\xB5\xB0\xFC\xDD\x5A\x63\xFC\x62\xF7\xA9\xEB\xE9\xEE\x1A\xF7\x68\xFC\xD1\xF7\x90\xF6\x95\xEF\x92\xF6\x97\xEF\x94\xF6\x92\xF7\xF0\xE9\x37\xA9\x36\xF7\x94\xFC\x27\xFD\x86\xFD\x46\xFC\xD1\xEF\xB8\xEF\x04\xF6\x0A\xF8\x2C\xF7\x0E\xDC\xF1\xF6\xF2\xD6\x50\xDD\x36\xCD\x52\xDD\x6E\xFC\xA3\xF7\x26\xEB\xA5\xF7\x7B\xF8\x03\xE3\x59\xA9\x3F\xEC\xCE\x6B\x99\xFD\x5D\xFD\x47\xFC\x73\xFD\xBB\xEC\x75\xFD\x62\xFD\x79\xF6\x3C\xE4\x65\xFD\x46\xEE\x5D\xF8\x75\xF8\x69\xFD\x18\xED\x5B\xF7\x0E\xCE\x7C\xC7\x0A\x99\x84\xFD\xB2\xB5\x9A\xFD\x73\x34\xDD\xFC\x76\xFD\xF9\xFC\x16\xFD\x86\xFC\xFC\xFC\xE5\xF7\x1A\xFD\xC4\xF7\x4D\xFD\xB6\xF7\x19\xF9\x39\xF9\xA0\xDE\x62\xDE\x66\xEC\x5A\xFD\xF2\xFC\x70\xFD\x29\xFD\x41\xFD\x79\xEF\x43\xFD\xDF\xF7\x8C\xFD\x57\xD4\x3F\xEF\x99\xD7\x79\xED\xD2\xD5\x6D\xFC\x7C\xED\x6F\xFC\x62\xEC\x94\xF7\x8E\x10\xCC\xE9\x83\xFD\xB0\xFD\x71\xFD\xDB\xFD\x64\xFC\xDD\xFD\x3C\xEF\x9B\xF7\x8D\xFD\x27\xF8\x07\xF0\x49\xFD\x0E\xF7\x4B\xFD\x6C\xF7\x53\xFC\x1D\xFD\x6C\xB7\x33\xF9\x51\xD5\xC2\xFD\xED\xFD\xDA\xFD\x5E\xFD\xB3\xFC\x60\xFD\x3E\xF8\xB6\xFD\xC1\xF6\x21\xF0\xF6\xF7\x23\xF0\x57\xF7\x25\xF0\xBD\xFD\x2E\xED\x6B\xFD\x1D\xD0\x1A\xF9\x63\xCE\xA1\xEC\xA8\xF7\x0F\xB9\xC3\xFD\x5E\x92\x11\xFD\xDE\xF7\xF2\xFD\x67\xFC\xE0\xFD\x8C\xF7\x2A\xEF\xE3\xFD\xF4\xD6\x90\xF7\x60\xEC\xE7\xFD\x7E\xED\xE9\xFD\x40\xF9\x59\xD0\xD7\xFD\x17\xFE\xFE\xBE\x19\xFE\x24\xEF\x2A\xF7\x90\xEF\x0B\xF8\x0E\xE2\x0D\xF8\x2F\xDE\x0F\xF8\x24\xDA\x11\xF8\xEC\xDA\x13\xF8\x5B\xF6\xC8\xEC\x2A\xC1\x1E\xEA\x1E\xEE\x2A\xFE\x29\xD7\x2C\xFE\xA3\xEF\xF5\xEB\x78\xA7\x6D\xEC\xBC\xEF\x00\xEE\xBE\xEF\x02\xEE\xC0\xEF\x04\xEE\xC2\xEF\xCB\xD8\x00\xE3\x12\xFE\x0F\xE4\xDB\xF7\x54\xC7\x3E\xFE\x41\xE2\x40\xFE\xBA\xEC\x8F\xEE\xCE\xF7\x45\xFD\xAE\xF7\xF5\xFD\x3E\xF6\xF7\xFD\x42\xF7\xF9\xFD\x80\xF7\xFB\xFD\x2C\xF9\x38\xF9\xAF\xD0\x70\xF7\xBF\xE3\xD0\xD8\xD8\xFD\x96\xFC\xB1\xFD\x9C\xFD\x2B\xFD\x8F\xEF\xED\xF6\x27\xEF\xEF\xF6\xA1", "\xFD\x2E\xF7\xA3\xFD\xF3\xF6\x26\xD4\x32\xF7\x0B\xE4\x91\xF9\x70\xF9\xDF\xEF\xFF\xF7\x5E\xEA\x5C\xF9\x1D\xD5\xCB\xEF\x53\xED\xB2\x76\x01\xFE\x54\xFE\xBF\xEB\x05\xFE\xB5\xFC\x14\xFD\x84\xFC\xCA\xFD\xFB\xFC\x18\xFD\xFD\xFC\xCE\xFD\xD6\xF7\xD0\xFD\xC6\xF7\x74\xD0\x79\xFE\x54\xFD\xF7\xD5\x82\xD0\x04\xD9\x1E\xED\x3D\xFD\x81\xFE\xF5\xFC\x1A\xFE\x82\xFC\x86\xFE\xB7\xFC\xFA\xFC\xE3\xF7\xCC\xFD\x88\xFC\x8C\xFE\xE7\xF7\x60\xFE\x31\xF9\x90\xFE\x4A\xF8\x64\xF8\x10\xE4\xEB\x09\x4B\xDF\xB6\xF6\x3D\xDC\xFE\xEF\xF1\xFC\x52\xFE\xC5\xFB\x82\xFE\xCE\xEC\x07\xF7\x9A\xE9\xC8\xFC\xD8\xF6\x47\xFD\x40\xF7\x5C\xFE\xB2\xF7\x5E\xFE\xB4\xF7\x8E\xFE\xD8\xF7\x63\xF9\xE9\x69\xBE\xB4\x31\xD6\x2C\xE4\x66\xDF\xFD\xEF\x30\xE4\x4B\xEA\x5B\xFD\x68\xFE\xEE\xFD\x03\xFE\x3C\xF8\x84\xFE\x78\xF7\x9C\xFE\xC9\xFC\x9E\xFE\xB9\xFC\xA0\xFE\xBB\xFC\xA2\xFE\x2C\xF8\xA4\xFE\x37\xF9\xF3\xB7\xA7\xFE\xB4\xC8\x67\x6E\x6A\xED\x1B\xF8\x82\xF9\x6D\xED\x4D\xD6\xB7\xBB\xFC\x16\x98\xFE\xB1\xFC\x88\xFD\x0D\xED\x8A\xFD\xBF\xF6\x07\xFE\xF4\xF7\x9D\xE9\x22\xF0\x9F\xE9\x67\xFD\x3C\xEB\x0E\xFE\x63\xED\x10\xFE\x2C\xD8\xD6\xEA\x04\xC2\x71\xDC\x46\xF0\x97\xF9\x6C\xD6\x81\xD9\x70\xA8\x9C\xFA\x1E\xFC\x75\x74\x06\xFC\x00\x00\xED\xDF\xE2\xE0\x58\xF1\x5E\x76\x9D\xF4\x48\x0F\xEC\xDF\xFF\xFE\xD1\x6B\x16\xF1\x51\x00\x3E\xF1\x96\xE8\x2C\x84\x1F\x64\xD4\xF0\x7A\x8C\x46\x47\x4A\xE7\x52\x00\x91\xE6\xC4\x4A\xE9\xD2\x1E\x64\x83\x60\x12\xFF\xAD\x8C\x46\x47\x2F\x09\x6C\xE6\xF6\xE7\x6F\x60\x5C\xE7\x6D\xDF\x84\xE6\xD7\xE7\xB1\xA6\x15\xA7\x0A\xFF\x2A\xFC\x71\x0F\xD7\xFB\x53\x00\xD5\xFC\x83\xF6\x86\x7B\x2D\xFF\x3F\x75\x9B\xF4\x14\x64\x6D\x02\x72\xE4\xC5\xDB\x39\x4E\x0C\xFC\xC5\xEF\x43\xBA\x82\xE4\x05\xFC\xFA\xF9\xBB\x99\xC8\x72\x40\xA7\x86\x47\xAB\xF2\xEE\xF3\x18\xC2\x59\xBD\x47\x6C\xE8\xF5\x40\xFF\xDD\xB1\x4C\xE0\xF6\xF3\xFF\xE4\x49\xFF\xFC\xB1\xE9\x36\x0F\xFA\x64\xFA\x44\xFA\x7E\xF5\xC7\x90\x4E\xFF\x1B\xB2\x50\xFF\xD6\xF4\xC7\xF2\x10\xFA\x25\xF5\x12\xFA\x20\xFA\x47\xFA\x09\x01\x56\xFF\x3C\x8D\x58\xFF\xE3\xF4\xAB\xAB\x3E\xC2\x5B\xFF\xF7\xBC\x12\xFA\x16\xF4\x53\xFA\x61\xFF\xCE\xAF\x63\xFF\x80\xF3\x48\xC2\x77\xFA\xB3\xF5\x3A\xFA\x4D\xFF\xDD\xA9\x6E\xFF\x90\xBD\xD8\xBC\x71\xFF\x4A\xC2\x02\xF5\x74\xFF\x03\x82\x76\xFF\xFA\xDB\x5B\xC2\x92\xFA\x24\xF5\x68\xFF\xA7\xF3\x3B\xF4\x7C\xFF\x27\x87\x7E\xFF\x8C\xF3\xA6\x6A\x68\x71\x15\xF5\x6F\xFA\x8C\xE5\x66\xFA\xFE\xE4\x68\xFA\x42\x6A\x6C\xFF\xC9\xB3\x88\xFF\xC6\xBC\x65\xC2\xE7\x77\x22\xF5\x81\xFF\x91\xF5\x5C\xFF\x84\xFF\x0E\x91\x55\xFF\x75\xFF\x86\x47\x6D\xFA\x19\xF3\x67\xFF\xD3\xE4\x12\xFA\xD5\xF5\x5F\xFF\x06\x01\x93\xFF\x1F\xBA\x95\xFF\xB3\xE5\x85\xC2\xC9\xBD\x76\xFA\xA4\xFF\x9E\xE5\x9D\xFF\xE0\xF5\x34\x6B\xEE\xF5\x02\x01\xAA\xFF\x58\xBA\x4B\xFF\x2B\xDA\x7F\xFA\xB6\xFF\x01\x01\xB8\xFF\x69\xBC\xBA\xFF\x85\xFA\xCA\xF3\x60\xFF\xA0\xFF\xF7\x41\x7C\xF4\xAA\xF4\xA3\xA5\xA8\xFF\x3B\x66\xC5\xFF\xA5\x64\x91\xFA\xDC\xF5\x87\x7D\x94\xFA\x6F\x8E\xFF\xB0\x16\xF1\xB6\x4B\xDB\xBD\x72\xF0\x03\xE0\x2F\x64\x69\xAB\x9F\xF1\x7A\x66\x1F\xE8\xBE\x77\xE1\xF0\x32\xF3\xEC\xA0\x66\x05\xD9\xFF\x17\xE0\x46\xD9\xBA\x97\xDB\x37\xEA\xF0\x00\xF2\x94\x16\xDB\x37\x53\xF1\xBB\xFB\x51\xFB\x3C\xD3\xC6\x6F\x1A\x53\x2E\xFF\xCF\xE7\xDA\x7A\xD7\x50\xDB\xD9\xE7\xE4\x81\x05\x16\x0A\xCA\xDB\xCA\x14\x45\x39\xF9\x63\xC3\xF9\x8D\x17\x91\xE6\x47\xD1\x69\xA5\x66\x90\x39\xFF\x7D\x7E\x70\x65\x2C\x4C\x00\xA3\x68\xA6\xF4\x06\x00\xA5\x01\x0A\x3E\x79\xEC\x05\xB9\x06\x1F\x7C\xB1\x58\x4E\xD1\x70\x1E\x27\x45\x73\x94\x61\x00\x84\x9E\x73\x4F\x59\x31\x73\x03\x2C\x16\x14\x08\x00\x9F\x86\x65\x94\x1C\x01\x80\x1A\x09\x74\x25\x0F\x00\xBE\x4B\x51\x00\x9A\x14\x51\x69\x71\x6B\x7F\x79\x7B\x6C\x72\x2A\x01\x79\x16\x3A\xFF\x79\x00\x89\xB7\x05\x73\x39\x02\x81\x0E\x80\x7B\xEC\x42\x1A\x38\x3B\x07\xE1\x77\xBB\x79\xBE\x00\xAB\x32\xBB\x68\xAA\x71\x26\x00\x8A\xE3\x66\x25\x78\xEA\x5C\x00\x80\x06\x81\x7C\x21\x1A\x00\xB5\xF7\x71\x00\x8A\x00\x8E\x01\x86\x89\x18\x08\x80\xCC\x71\x4E\xFB\x11\x0F\x2C\x9A\x3C\x02\x01\x69\x76\x07\x72\x51\x79\x82\x78\x08\x61\x17\x00\xB6\x99\x7B\xFF\x71\x04\x84\x4A\x47\x0B\x80\x0B\x05\x45\x00\xE2\x68\x07\x01\x93\x72\x39\x6E\x1C\xD5\x33\x16\x01\x48\x73\x3D\x00\x60\xCD\x7D\xD0\x72\x02\x85\xFE\x7C\x0A\x81\x0B\x81\x89\x3F\x57\x00", "\xF9\x16\x19\x01\x90\x89\x2B\x05\x83\x0A\x81\x24\x7B\x82\x1C\xAC\x66\x5A\x00\x11\x9A\x6F\xA4\x7F\x04\x80\xE5\x35\x70\x2C\x32\x80\x26\xFF\x0A\x00\xAF\x24\x14\x03\x89\x02\x70\x06\x81\x00\x7F\x1E\x04\x0E\x00\x85\x00\xA1\xE3\x0C\x35\x39\x05\x01\xD2\x73\x32\x68\x71\x78\x34\xE5\x28\x1A\x38\x01\x8D\x3C\x71\x60\x2D\x28\x1F\x4B\x05\x43\x80\x97\xF2\x7E\x00\xA5\xB2\x7B\x74\x07\xC4\x00\x47\x6B\x95\x32\x09\x80\x91\xE6\x13\x00\xA7\x00\x97\xFF\x79\x02\x84\xD3\x07\x0A\x80\x20\x80\x67\x00\x89\x02\x1A\x02\x8B\x61\x7D\x08\x80\x0B\x81\x0C\x81\x36\x80\x73\xF9\x7A\xE3\x46\xC3\x7D\x7D\x37\xF1\x7C\xDD\x70\x27\x81\x17\x03\x3E\x00\xEE\x00\xA0\x02\x9C\x74\x0F\xF1\x7D\x4F\x79\x29\x80\x35\x80\xA7\x00\x81\x01\x89\x7D\x61\x08\x7F\x15\x6C\xF1\x21\xA4\x73\xB9\x68\x02\x00\xBD\x00\xAA\x00\x85\x00\x8E\x08\x86\x17\x80\x07\x80\x53\x80\x7F\x00\xB2\x00\x95\x02\x88\x02\x84\xB1\x7D\xEE\x00\xAB\x32\x66\x78\x34\xA7\x50\x01\xA0\xFF\x6F\x05\x8B\x08\x85\xF5\x72\x19\x80\x5A\x80\x24\x00\xC7\x01\xB8\x02\x89\x06\x88\x0A\x80\x8A\x71\x0D\x80\x55\x78\x70\x0F\x4C\x00\x9C\xD4\x22\x07\x88\x08\x84\xAF\x4E\x30\x80\x4F\x80\xC4\x00\xD5\x00\x86\x04\x04\x07\x81\x09\x80\x19\x83\x24\x80\xD6\x06\x64\x07\x76\xCF\x77\x07\x3E\x02\x81\x69\x77\x0B\x81\x1D\x80\xFD\x4A\xF8\xFF\x43\x01\xBF\x00\x9A\x03\x88\xFA\x36\x16\x82\xEE\x4A\x49\x80\xB8\xEC\x6C\x00\xBA\x02\x92\x05\x81\x19\x29\x0E\x81\xA4\x72\x39\x80\xF7\x00\xE7\xE1\x55\x03\x84\xAB\x75\xFB\x6E\x20\x00\x42\x81\x3E\x80\xEE\x00\x81\x02\x94\x02\x82\x37\x0F\x09\x85\xF2\x24\x21\x81\x48\x73\x85\x00\x89\x02\x87\x58\x57\x03\x81\x0B\x85\x0C\x80\x0B\x80\x6C\x80\xD4\x2B\x7E\x01\x97\x03\x98\x4A\x0B\x06\x83\x22\x81\x3C\x80\xE7\x68\xFF\xF9\x5A\xCF\x7F\x71\x63\xB7\x42\xFF\x7E\x09\x79\x45\x3F\x30\x00\x2D\x01\xFA\xDE\x0D\xE2\x79\xE5\x36\x5E\x35\x36\x7C\xB6\x7F\x29\x5F\x30\xEE\x56\x64\x72\xF1\x6A\x42\x7B\xC8\x61\x1E\x66\xA2\x6B\x2D\x7E\xFF\x00\x7C\xD5\x44\xC7\x3C\x52\x06\x13\x84\xA3\x7C\xF7\x4D\x9C\x80\x0D\xB5\x18\xED\x5F\xFB\x54\xB0\x70\xFB\x66\x35\x73\x31\x7D\x71\x56\xA8\xF8\x34\x02\xB9\xA6\x25\x0A\x87\x84\x7C\xBF\x7E\xF0\x69\x3F\x74\xD6\xED\x55\xB3\x7C\xF9\x67\xF3\x39\x1E\x76\x3C\x6E\x11\x48\x21\x35\x54\x01\xFE\xFA\x58\xE4\x6D\xE4\x7E\x1F\x72\x27\x64\x80\x70\x96\x6E\x81\xF9\x03\xC4\x7D\xE2\x74\x8F\x43\xB9\x51\x2C\x80\xA0\x7B\xBF\x7E\xD0\xCF\x43\xF1\x4C\xD7\x6E\x0B\x8A\x75\x78\x2E\x80\xE8\x68\x0E\x77\xC9\xF8\x71\xA0\x74\x05\x80\xC3\x7C\xB0\x70\x9D\x7E\x15\x7E\xA5\x80\xC0\x6A\x52\xF1\x6F\x5C\x65\x1B\x66\x29\x53\x39\x53\xF6\x70\xA8\x05\x97\x80\x22\xEE\x7D\x7D\x75\x57\x7E\xD3\x37\x3B\x64\xED\x5F\x27\x77\x2E\xDF\x34\xED\x57\x40\x75\xC7\x73\xBA\x75\xF7\x5B\x57\x7C\xCC\x36\x8A\x01\xAD\x4F\x45\x27\x66\xC7\x74\x19\x80\xB5\x6C\xFF\x66\xC4\x80\x99\x85\x19\x03\xA0\xD9\x43\xE8\x76\x3B\x62\x52\x72\xA4\x7F\xD3\x6B\xDE\xF8\x06\xDD\x66\x41\x40\x0D\x8C\xAE\x42\x34\x82\x8E\x5A\x9E\x74\xB3\x8D\x7E\xF1\x67\x06\x80\xC8\x79\x16\x82\x20\x7D\xF9\x60\xD6\x6B\x0E\x9A\x7B\x02\xAA\xF5\x76\x0B\x86\xBD\x45\xAD\x7C\xE8\x7D\xF1\x47\xAE\x01\xCF\xAA\x4F\xE4\x79\x66\x58\x19\x84\xC4\x7F\x7A\x76\xCB\x7E\xEF\xE2\x28\x1F\x75\x04\x81\x0E\x82\x56\x69\x75\x71\xE9\x5B\x1E\x76\xAD\xFD\x3F\xF1\x43\xF9\x46\x0E\x82\xEE\x15\x34\x75\x5B\x7D\xE9\x80\xA8\xFD\x78\xED\x47\xDD\x7E\x1D\x78\x92\x7E\xBA\x7F\x94\x7C\xDD\x80\xBE\xFD\x3C\x03\x8D\x62\x64\xBC\x78\xC7\x75\x2D\x80\x73\x80\x12\x68\x49\xEF\x7F\xFB\x5B\x95\x73\x0A\x87\x1E\x84\x75\x6D\x54\x7D\xBB\x51\x14\xFE\x79\x46\x6E\x9A\x40\x0F\x8F\xE0\x7A\x3C\x80\xA3\x4E\xDC\x7B\x84\xDB\x35\xE7\x74\x07\x93\xF7\x76\x1F\x81\xF5\x67\x21\x7B\x95\x60\x28\x90\x6A\xF7\x2D\x07\x88\xE9\x6B\x94\x78\x44\x5F\x2D\x6D\x1A\x75\x54\xF9\x4B\x03\x94\x07\x8B\x0C\x87\xD6\x36\x39\x83\xB1\x67\xD5\x80\xA9\x67\x7B\x03\x99\xB6\x74\xF7\x7E\xFD\x72\xE7\x7C\xB0\x75\x6C\x78\x06\xED\x02\xF0\x7D\xBF\x7E\xCA\x7F\xF8\x39\x31\x83\x82\x80\x33\x52\x8B\xF8\x06\xFA\x76\x57\x6C\x78\x0B\x0B\x4B\x10\x69\xFF\x76\xB6\x7C\xC5\x7F\x1E\x04\x99\x07\x81\x68\x7F\x3E\x73\xDB\x7E\x0C\x7C\x9A\x76\x8B\xF9\x1A\x8A\x4F\x7D\x6B\x85\x6D\x1A\x87\x43\x80\xF1\x76\x45\x75\xC6\xEF\x0B\xDD\x7F\xE5\x65\xF6\x77\xD5\x7C\x75\x64\x84\x80\x05\x81\x2B\x02\x9B\xDE\x49\xE1\x78\x11\x8C\xD4\x71\x6A\x7A\x62\x7C\xB0\x6C\xAA\xD7\x45\x97\x6E\xB5", "\x74\xF0\x34\x14\x83\x40\x82\x1B\x6F\xF7\x80\x23\xAB\x78\xFD\x56\xE6\x73\xE3\x6B\xEF\x7A\x8D\x70\x21\x7C\x26\x78\x09\x93\x59\x8B\x60\x85\x60\xCD\x71\x1D\x6A\x34\x7D\xEA\x44\xDD\x7C\x2D\x71\x47\x87\x37\xEC\x7B\xBF\x43\x17\x48\x47\x1B\x7C\x7C\xEA\x6F\x7A\xBE\x69\xF9\x4A\x6D\x40\x13\x86\xF4\x33\x0A\x01\x56\x0B\xD6\x21\x70\x80\x38\x0D\x1B\x09\x8B\xCD\x7D\x25\x85\x35\x7F\x58\x49\x3E\x5F\x91\x0E\x5F\x90\x39\x05\x0D\x1D\x2B\x92\x30\xE0\x03\x9C\x80\xDB\x7C\x75\x02\xB8\xF3\x7A\x7E\x5D\xF3\x5D\xBF\x02\x7C\x24\x9C\x81\x94\x7F\x9B\x6B\x16\xE2\x64\x01\x02\xCF\x77\x7A\x77\x24\x00\x1F\x7C\xC0\x33\xFD\x77\x02\xE7\x22\x56\x74\x01\x08\x9E\x7F\x80\x24\xAB\x32\x33\x00\x91\xE6\x7A\x00\x0C\xF8\x5A\x14\x83\x5F\x3E\x3D\x7E\x59\x71\xF9\x49\xF1\xF9\x78\x0E\x27\x09\x98\x27\x57\x8C\x6E\x3E\x7D\x3F\x3F\xCA\x2C\xDF\xF9\x38\xD1\x0B\x0A\x95\x0A\x7E\xFF\x7F\x51\x82\x6A\x39\x48\x81\xAC\x72\x13\x05\x95\x0A\x94\xDE\x47\x29\x81\x53\x83\xA6\x80\xBA\x3A\x9E\x02\xE7\x14\x0B\x46\x41\x15\x80\x96\x03\x54\x81\xC0\x04\x07\x6B\xA6\x02\xC9\x0A\x48\x0A\x8F\xE1\x72\x0F\x71\x21\x02\x8C\x69\x19\x70\x40\xFC\x45\xD1\x55\xB9\x6B\x4F\x03\xC7\x37\xE4\x2C\x55\x01\xE3\x7E\xEB\xFE\x4C\xF8\x75\xDF\x62\xC2\x78\x6A\x7C\xC1\x7E\xAA\x7A\x79\x7F\x13\x02\xFD\x02\x85\xEF\x66\x43\x7A\x8D\x7B\x8E\x7D\xC4\x75\x0A\x7B\x9D\xD9\x65\x04\x80\x0B\x63\xD0\x5F\xBC\x7F\x90\x72\xFC\x1C\x68\x81\x58\xF8\x55\xDF\x5A\xE1\x64\xB1\x73\x87\x7E\xC4\x7B\x4C\x7E\x1B\x76\x35\xFD\x2A\xEC\x51\xE2\x6C\xB1\x73\x24\x70\x1A\x7C\xC4\x75\xDE\x76\xA4\xF8\x4E\x02\x90\xC7\x58\xE3\x72\xDC\x74\xEA\x61\xB9\x80\xC6\x61\x80\x51\x68\x05\xAF\xE1\x6A\x17\x81\x87\x7C\x5D\x81\x4C\x7E\x3A\x7C\xEF\x02\xA8\xEC\x71\x0B\x83\xC7\x7D\xCD\x65\x15\x7C\x92\x7B\x57\x7C\xD8\xED\x04\xD1\x4A\x64\x5F\x17\x80\x72\x61\x60\x82\x44\x7E\x25\x7E\xC8\xFD\x15\xFA\x6E\xBF\x77\xE8\x70\xFF\x71\xA3\x7E\xFC\x77\xE7\x7E\x37\x01\xBF\xF9\x5E\xF4\x6D\x6F\x76\x16\x87\xBD\x76\xF1\x68\x56\x7F\xF6\xB1\x6B\x02\x85\x88\x72\x4C\x54\x31\x87\x18\x6A\xC5\x80\x4D\x7F\xB5\xFE\x50\xFD\x77\xFA\x72\xF6\x7B\xCC\x7C\xDA\x7D\x33\x7E\x6B\x7F\x8A\xFC\x21\x06\x91\xF3\x78\x50\x61\xCC\x7F\x21\x42\xC3\x49\x96\x81\xD4\xD0\x67\x05\x97\x0C\x9C\xE4\x7B\x9A\x70\xB3\x6D\xFE\x74\x20\x75\xFB\xEB\x05\xDE\x44\xBD\x74\xE9\x7F\xC4\x75\x57\x75\xC3\x81\x15\x6D\xD7\xFC\x4B\x05\x9A\x0B\x0D\x16\x84\x76\x17\x65\x81\x8B\x7F\x04\x7C\x2B\xF7\x72\xD2\x6D\xDC\x7A\x5F\x79\x60\x7C\x7F\x75\x6C\x75\x3A\x7F\x7B\xE9\x4C\xF1\x42\xF1\x79\x68\x61\x8A\x7D\xB3\x74\x36\x75\x1A\x77\xEF\xFC\x64\x9F\x71\xF3\x60\x1A\x84\x62\x5E\x6A\x81\x90\x7F\x7E\x77\x6D\xFE\x11\xDF\x68\xBC\x7E\xF0\x70\xF4\x70\xC4\x7D\xC3\x6A\x11\x7F\xB0\xEC\x41\x04\xA5\xB0\x61\xBC\x6D\xBC\x71\xB1\x6E\x4E\x7F\x2E\x6D\x07\xD0\x67\xF1\x48\x1B\x7C\x7F\x6C\xDF\x54\x6D\x81\xA3\x5A\xB7\x81\x55\xFE\x6A\xDF\x57\xF9\x76\xF5\x7A\x70\x78\xD7\x7C\xF0\x7A\x5D\x7F\xC2\xF7\x38\x06\xBD\xF2\x7A\x19\x80\x6E\x7D\xC8\x78\x08\x7A\xCE\x80\xA2\xEB\x1E\x03\xB7\xE0\x79\x4D\x36\x38\x85\x9E\x74\xE2\x81\x41\x7F\x5D\xEE\x06\xFC\x69\x0B\x83\xEB\x72\xD1\x76\xDD\x7C\x45\x76\x78\x7F\x16\xED\x58\x05\xB6\xB6\x74\x10\x81\x36\x62\xFD\x64\xF6\x4A\x57\x71\xEC\xEB\x3C\xFA\x6B\x0D\x94\x1A\x87\xAF\x2A\x68\x80\xCC\x81\x06\x75\x58\xFE\x50\xEF\x5A\xF9\x70\xBD\x70\x39\x84\xFA\x7A\xE4\x81\x67\x7E\x94\x03\x81\xFA\x70\x42\x5C\xC7\x7C\x2A\x72\x36\x82\x88\x81\xAA\x7E\x80\x03\x8A\xA9\x71\x8A\x64\xC8\x7E\x9F\x6E\xC6\x40\xED\x81\x8B\x2A\xB6\x03\xD7\x06\x9E\xF6\x79\x1A\x8C\x9A\x77\xC0\x78\xD7\x81\x97\x7B\x5E\x03\x8B\xEC\x60\x0D\x93\x4D\x74\x94\x7F\x7F\x61\x42\x7C\x45\x5B\x0F\xB9\x1D\x07\x99\xAF\x7F\x1C\x83\xEB\x7D\x8C\x7E\x77\x7E\xC5\x7B\x1D\xFE\x69\xF8\x4D\xDE\x6B\xE3\x7F\x71\x7D\xBC\x7D\x7A\x76\x1B\x81\xE7\xB3\x43\x03\x86\xF6\x5C\x52\x02\x3E\x83\x99\x60\xF9\x80\xAC\x76\x76\xF6\x0B\x07\xB2\x0C\x8D\x1C\x84\x33\x80\xA9\x7E\xCD\x80\xA5\x7E\xBF\x03\xE5\xF9\x41\x0F\x8E\xEA\x78\x1C\x86\xD4\x47\xC4\x81\xE7\x81\xA1\x40\x77\x07\xA2\xDA\x61\xEB\x73\x3A\x87\xB6\x7C\x4A\x76\xD3\x81\x2A\xED\x28\x07\xAC\xB4\x6A\x1D\x8A\xE4\x74\x75\x82\xB8\x6F\xC9\x7C\xAA\xE3\x7B\x9B\x5D\xE4\x7D\x6F\x6A\x94\x48\x81\x80\xD6\x37\xE8\x81\x6F\x03\xEC\xED\x43\xF9\x66\x7D\x7F\xDF\x75\x0B\x75\x80\x76\x09\x71\x03\xEE\x14\xB8\x45\xB8\x6F\xF2\x56\x1D", "\x81\xD7\x78\xD3\x24\x0F\x82\x1F\x78\x0A\x08\x9D\xF6\x6A\x4D\x75\x60\x7A\x6B\x80\x9C\x7F\xEB\x81\x72\xFE\x30\xEE\x74\xDB\x6C\xB0\x7E\xE7\x67\xCE\x7E\x4E\x46\x07\x81\x81\xB9\x29\xF2\x66\xDC\x75\x1F\x8C\x01\x7C\x3F\x68\xD6\x26\x81\x81\x2D\xFD\x70\xF0\x6F\xF4\x72\xC3\x77\x30\x86\x5D\x81\x13\x76\xA6\x81\x46\xEF\x4E\x06\xBA\x38\x64\x0F\x8C\xE3\x61\x7C\x80\x0C\x82\x3C\x3C\x32\x04\xEB\xFC\x64\xBE\x63\x21\x8E\x6E\x7D\x84\x82\x70\x75\x13\x82\x55\xEA\x29\x08\xB3\x78\x6B\x21\x88\xA2\x6E\x38\x55\x7A\x80\xAE\x6D\x07\x04\x9C\xCD\x60\x10\x89\x1C\x8B\x68\x7D\xB6\x7D\x03\x82\x04\x7F\x7A\xF6\x10\x08\x95\xB6\x72\x20\x81\xD6\x74\x82\x80\xF7\x76\x0B\x82\x9A\xDF\x63\xFC\x44\xDC\x67\xBD\x72\x1F\x86\x8A\x82\x1A\x82\x61\x22\x48\x04\xC5\x06\x9E\xF2\x67\x1A\x80\xCA\x7B\x89\x76\x4C\x7F\x27\x82\xF0\x02\xCD\x06\xB6\xF4\x62\xDC\x6D\x57\x6C\x8C\x4B\xDC\x7A\xB0\x25\x57\x04\x83\x00\x59\x11\x93\xED\x76\xE5\x7E\x8D\x83\xC0\x80\xD2\x81\x93\xED\x72\x08\xB2\xB6\x74\x23\x87\xD9\x76\x8E\x83\x09\x78\x3C\x82\x2A\xDA\x07\xDF\x47\xE5\x6A\xBE\x74\x2E\x81\x92\x82\x0B\x21\x35\x82\xA0\x03\xB6\xE0\x4B\xF6\x68\x1F\x8F\x71\x69\xBC\x7D\x1B\x6C\xBB\x81\x64\xD7\x33\xEF\x58\xBD\x77\xBE\x7A\xF5\x76\x24\x7C\xD7\x77\xCE\x77\xDE\xEC\x44\x6D\x44\x11\x80\xE4\x73\x49\x87\xAB\x7D\xE8\x81\x42\x7F\x19\x03\x87\xFD\x5B\x0C\x8B\xEE\x7A\xE8\x7D\xB9\x7F\xC7\x81\x46\x7F\x03\x04\xD1\xFB\x62\xF9\x79\xCB\x64\x70\x7C\xFD\x78\xF0\x70\x66\x81\x7F\x04\xC9\x9C\x01\x12\x95\x21\x85\x3D\x83\x6B\x80\xD2\x81\xAE\x81\x4A\x03\xDF\x06\x87\xBC\x73\xB9\x7E\x43\x84\xE5\x65\x88\x81\xC8\x80\x59\xF9\x4A\x68\x5B\xE5\x75\x0D\x8D\x95\x7B\x30\x5F\x2E\x82\x4C\x73\x80\x04\xC3\x06\x8A\x75\x62\x24\x8E\xD2\x7C\x90\x80\x4C\x7F\x50\x7E\x87\x04\xA3\xF9\x50\x11\x85\xE5\x72\x45\x84\xE5\x6F\x37\x82\x0B\x7C\xFD\xDB\x68\xF2\x7F\x6F\x7A\xC0\x72\xD2\x7E\xED\x69\x07\x7D\xD9\x81\xD1\x04\xC7\x08\xAA\x13\x93\xF4\x69\x44\x84\x60\x83\x12\x82\x83\x81\xF0\x04\x88\x06\x88\x12\x8A\x18\x8A\x48\x81\x1B\x7E\xDF\x6F\x31\x7C\x33\xED\x6C\x76\x71\x08\x8B\xA4\x63\x23\x81\x4F\x74\x6B\x04\x53\x82\x58\x4D\x28\x09\xA5\x0F\x91\xEF\x7B\xE9\x79\x98\x81\xA7\x7E\x44\x7F\x9F\xFE\x45\x09\xA1\xFA\x67\x26\x83\xEA\x7E\x28\x81\xA9\x7E\x6D\x7F\x44\x02\x97\x04\xBA\x08\x9B\xE1\x68\x32\x81\xAA\x77\x60\x7D\x3F\x7F\x71\x6D\x67\x09\xB8\x91\x7A\x28\x88\x3F\x86\xD7\x7A\xFE\x80\x8F\x82\xD1\xFE\x20\x0A\x93\xFB\x62\x29\x85\xED\x7C\xA4\x83\xB5\x7E\x93\x82\xD9\xFE\x44\xC8\x6E\x08\x88\xB2\x6F\x95\x68\x15\x6B\x22\x6A\x62\x75\x4C\xF8\x74\x07\x98\x14\x9A\x1D\x39\x4E\x87\x76\x83\x24\x77\xDC\x81\xF4\xFD\x0E\x07\xA8\xE0\x7D\x1D\x8A\x82\x79\x80\x83\x3F\x7F\x64\x82\x8F\xFE\x58\x97\x58\x10\x9B\xC0\x35\x99\x7D\xC7\x76\xB6\x74\xB4\x76\x69\xE4\x03\xF1\x7D\xFB\x65\xC4\x76\xFC\x6D\x95\x13\x57\x79\x08\x33\xFE\xE6\x1A\xCE\x4E\xD0\x34\xB9\x49\xDD\x7E\x8F\x7F\xC1\x72\x49\x6A\xC3\x02\xDC\xE2\x74\xBF\x49\x03\x09\xF3\x7B\xA0\x77\xD1\x72\xA9\x73\xFF\xF0\x37\xFE\x7E\x8F\x15\x2B\x89\xF8\x79\x52\x3D\x01\x80\x57\x6E\x88\x94\x45\x05\x86\x04\x1E\x96\x60\x35\x69\x59\x81\xA1\x7A\x96\x60\x12\xFC\x00\xE0\x62\xBE\x6C\x23\x89\xC4\x7C\x68\x80\x35\x82\xA3\x81\xD6\x03\xD7\x09\x98\x0F\x99\x26\x8A\x3D\x83\x9B\x82\x9D\x7E\x94\x6B\x7E\x01\xAD\xEC\x6A\xF3\x6F\xB1\x76\x89\x78\x5C\x80\xDB\x69\x2E\x7E\xA9\x67\x09\x0B\x98\xC0\x61\x7D\x7D\xF8\x74\xB1\x80\x4B\x7E\x76\x82\x4A\x04\xEE\x09\x8C\x11\x89\x28\x8E\x44\x82\x9E\x81\x22\x83\x28\x82\x9F\xF8\x5B\x05\x82\x0A\x83\xBD\x6C\x59\x81\x1C\x50\xBE\x74\x3D\x44\xCD\xE1\x32\x9F\x43\xA3\x71\x0A\x8E\xE1\x72\xB4\x81\x7F\x7C\xD2\x82\x1A\xF0\x53\x09\x9F\xF6\x76\x21\x8F\xD1\x6C\x2E\x77\x44\x6C\xBB\x74\x7A\xED\x6E\x07\x99\xBC\x7A\x1B\x88\xDE\x7E\x72\x83\x01\x74\x53\x66\x2B\xEB\x4A\xEC\x6D\xAC\x6C\x65\x64\x29\x4E\xB7\x82\x81\x7D\x0C\x78\x77\xEF\x19\xF9\x41\x1C\x62\x67\x77\x3E\x83\xBE\x7D\xFA\x80\xC7\x7E\x9E\xF7\x10\xFB\x60\xDE\x72\xEC\x72\x7A\x7C\xB2\x7C\xE9\x7A\xE7\x82\x3B\x0F\x29\xF9\x41\x88\x7B\x0A\x88\x09\x75\xFB\x51\x99\x66\xEB\x82\x0C\xFA\x58\x0B\x94\xEF\x72\xE5\x7D\xEC\x7F\x97\x83\xB3\x7E\x9C\x82\x33\x03\xBA\x0A\xB5\x0C\x9C\x29\x87\x33\x86\xA7\x81\xCE\x80\xA0\x82\x8C\xFC\x71\x02\xBD\x0C\x80\x00\x0E\x7F\x51\x89\x5E\xE4\x3C\xE9\x7D\x76\xEF\x73\x0B\xA7\xFB\x6B\x6D\x79\xEE\x7F\xA6\x81\xB4", "\x81\xBB\x7E\x4D\xFC\x1C\x06\x8F\xF1\x7E\x18\x81\xC5\x78\x64\x80\x80\x82\x91\x81\x64\x01\xC8\xF1\x41\xF1\x61\xCD\x67\x60\x82\xB1\x81\x69\x83\x54\x82\xF9\x03\x96\x09\x85\x14\x98\x24\x86\xFD\x72\x93\x80\xF6\x76\x4E\x82\xB4\xED\x1E\x09\xAC\xDA\x6C\xF4\x31\xC7\x7A\xC2\x79\x34\x7C\x4D\x7B\x83\x01\x80\x9D\x5D\xDA\x68\xB7\x75\x69\x50\xC1\x82\x7C\x82\xE9\x31\xF4\x05\xC2\xFA\x63\xE0\x77\x2F\x8F\x60\x81\xB9\x7F\x30\x83\x44\x7F\x1D\x03\x8B\xFD\x7E\x17\x93\x1C\x87\x61\x83\x67\x83\xF0\x80\x77\x74\x04\xFD\x10\x03\xB8\x13\x9C\x75\x76\xD5\x7B\x2B\x81\xD0\x3E\xA9\x6B\xE6\x65\x70\x0B\xB0\xE8\x73\xDE\x78\x63\x83\xC1\x81\x11\x83\x4D\x7E\xEB\x04\x8F\x0B\x83\x12\x91\x2C\x85\x48\x84\xE0\x76\x28\x7E\x97\x77\xA4\xFC\x30\xDE\x6F\xE5\x65\xCA\x7F\xD1\x78\x73\x83\xA3\x74\xD0\x61\x9B\x03\xC2\xD4\x12\x19\x9D\xD1\x76\xFB\x77\xBD\x7D\x62\x7E\xEE\x82\x1B\xFE\x50\x0A\x9F\x17\x9B\x1D\x82\x7D\x7C\xAA\x82\xE5\x76\x59\x82\x98\xEF\x34\x09\x9A\xBE\x7C\x1B\x8E\x3A\x81\xA7\x7F\xB0\x7F\x72\x7B\x3D\x02\xA7\xD2\x78\xB8\x76\xE2\x6D\x61\x83\xB4\x81\x9B\x82\x66\x7F\x3A\x06\xB4\xF9\x7C\x18\x8F\x23\x8C\xEE\x78\xB6\x76\x89\x82\x3E\x7B\x28\x06\xDA\xDF\x6A\x18\x88\xB6\x7D\x1F\x84\x90\x68\xF1\x81\x9E\x74\xC6\x03\xE0\x09\x9F\xAE\x68\xE8\x72\x38\x86\x7D\x74\x6E\x80\xC9\x54\x6B\x06\xEB\xF4\x4B\x16\x80\x31\x86\x53\x82\xC4\x80\x6A\x82\x83\x82\xAA\x05\x88\x0A\x86\x12\x8A\x28\x8E\x5A\x84\xA1\x80\x6C\x82\x87\x82\x08\xF9\x2F\x8E\x49\x6B\x7B\x5A\x71\x6A\x82\x50\x7F\xA1\x82\xD9\x7E\xBE\x04\xAA\x09\xAA\xFB\x6C\x34\x82\x2D\x85\xDD\x7E\x82\x7F\x77\x7F\xD6\x02\xC6\xED\x53\x1A\x9B\xBF\x70\x4A\x87\x5F\x49\x09\x68\x92\x59\x0F\xB9\x35\x0D\x8E\xEA\x61\x80\x72\x3D\x84\x86\x83\x70\x83\x6A\x82\x37\x04\x92\x0B\xB9\x10\x99\x1E\x81\x73\x7E\xB2\x81\xD8\x81\xEE\x81\x37\xC4\x17\xFB\x48\x16\x96\x31\x80\x5C\x81\xBB\x82\x70\x82\xEA\x81\x90\x05\xD6\x09\x9D\x19\x89\x1A\x8F\x65\x83\x69\x83\x6B\x82\x7A\x82\x8B\x04\xC2\xB7\x40\x11\x8B\xAD\x60\x1D\x80\xDD\x57\x8E\x6F\x1A\x83\x1E\x06\xC1\x0B\x83\x14\x9B\xF9\x6D\x63\x82\x63\x80\x38\x7E\x62\x82\x41\x06\xC6\x09\x95\x18\x88\x26\x85\x64\x83\x32\x49\x0B\x83\x86\x7E\x55\x34\x5C\x0D\xB7\x1A\x8A\xF3\x74\x49\x82\x71\x82\xA9\x82\x2D\x83\xED\x04\xDC\x0C\xAF\x13\x8B\x35\x8D\x5A\x80\xCC\x83\x3C\x82\x31\x83\xA6\xFC\x30\xDF\x53\xF7\x7B\x61\x75\x01\x7A\x88\x83\x23\x82\xCD\x08\x02\x07\xE7\xDF\x79\x18\x9C\xEE\x7B\x63\x84\xA8\x7C\xE3\x80\xDF\x7B\x52\x05\xF6\xFB\x7F\x0F\x98\xEF\x76\x55\x84\xA9\x7C\x56\x83\x5F\x7F\xFD\xFD\x77\xD8\x55\x11\x8F\x2F\x89\x71\x83\x06\x78\xAE\x82\x02\x7F\xF6\x05\x9E\x0E\xBB\x0F\x80\x39\x8D\x3F\x81\xD7\x7F\xC8\x83\x2E\x7F\x25\x07\xFA\xFB\x7D\x1B\x82\x1E\x8E\x37\x74\x91\x76\x77\x75\x01\x5D\xCA\x06\xBA\x04\x8C\x1B\x81\x21\x8E\xE2\x79\x6E\x80\x8C\x7F\x28\x75\x32\xFE\x05\xC8\x74\xF8\x71\xEA\x66\xE3\x7F\xB3\x6C\x8E\x7F\xE6\x80\x5B\x05\xE4\xAA\x71\x07\x80\x4F\x50\x6A\x85\xE5\x83\xD0\x82\xD3\x82\x6C\xFE\x5C\x08\xAE\xF9\x7E\x22\x89\xC4\x70\x8C\x80\xCB\x76\x31\x82\x09\xE4\x64\x08\x95\x75\x66\x23\x8D\x48\x86\x61\x49\xD0\x82\xBF\x7C\x57\x07\xA4\x0D\xB4\xF5\x73\xE8\x78\x5F\x84\x7F\x82\x7E\x82\xFF\x81\xFC\x05\x80\x08\x83\x19\x80\x1E\x8B\x73\x84\x80\x83\x86\x76\x19\x7E\x00\x02\xD8\xF9\x4F\x46\x16\x3A\x83\x6A\x83\xA3\x81\xC7\x83\xEE\x82\x1C\xFE\x2D\x09\xB4\x0D\x82\xEF\x7E\x78\x7D\x9F\x74\xDE\x81\x7F\x76\xCC\x05\xA5\xFC\x6F\xDD\x7B\x23\x88\x4B\x84\x75\x72\x42\x4D\xB3\x83\x4C\x06\x83\x0E\xA8\xBF\x65\x38\x8D\x46\x84\xED\x81\xBD\x82\x61\x82\xF7\x06\xC0\x0C\x93\x18\x82\x32\x8B\x6F\x85\xA4\x81\x55\x81\x30\x7F\x5A\x05\xCE\xFC\x76\xB4\x68\xFE\x7E\xDE\x58\x88\x6C\xE4\x83\xA3\x78\x92\x07\x9B\x0E\xB0\xF7\x7F\x3B\x81\x67\x87\xE3\x82\x09\x7D\x90\x83\x5B\xFE\x37\x0E\xBB\xFA\x79\x39\x8F\xE5\x7D\xEE\x82\x32\x82\x94\x82\x7D\x05\xC7\x3E\x66\xE5\x7C\xBE\x56\x3D\x71\x2F\x63\xB7\x7F\x0A\x78\x1C\x02\xB9\xDC\x41\x1C\x91\x37\x8E\x6D\x83\xDE\x81\x67\x70\x5E\x83\x10\x06\xD3\x05\xB9\xF5\x63\xC2\x70\xC5\x7D\x08\x7F\x46\x7F\xCF\x83\x27\x05\xC2\x0A\xB6\x15\x9B\x3D\x8B\xD4\x58\xDF\x66\x89\x81\x40\x83\x73\xCB\x03\x73\x67\x1E\x9A\x77\x72\x6F\x86\xA9\x82\x56\x77\x99\x83\xAF\x07\xB5\x0E\x8F\x0E\x92\x3D\x81\x39\x83\xEE\x82\x00\x82\xDB\x83\x59\x05\xD2\x0F\xBD\xE1\x68\xFA\x6F\x67\x72\xE9\x6C\xFF\x76\xEC\x83\x71", "\x0F\x15\x0A\x85\xE0\x7B\x3B\x84\x7C\x82\xC1\x82\x76\x83\xF8\x63\xE6\x03\xAD\x0F\xA0\x1F\x86\xEA\x72\x7E\x83\xAA\x80\xF9\x82\xDF\x81\xE6\x07\xD7\x0A\xA8\x1F\x88\x39\x88\x7B\x80\xAA\x7C\xFE\x76\xE8\x75\xA8\x07\x92\xE0\x7C\x08\x8E\x32\x8F\x09\x69\xCD\x81\x5C\x37\xED\x83\x0E\xEF\x1F\x0C\xBE\x1D\x8A\x34\x82\x73\x85\xED\x80\xCD\x83\xB7\x83\x36\x07\xF1\x0E\xA4\x1C\x81\x40\x86\x72\x83\x00\x85\x2D\x82\x60\x7F\x29\x71\x42\xFD\x44\x15\x9D\xF6\x73\x51\x83\xDF\x6C\x52\x83\xBC\x66\x85\x06\xBF\x0B\xA9\x1E\x96\x32\x80\xC8\x78\xCB\x80\x41\x83\x53\x83\x24\x06\xEB\x05\xB9\xF6\x7C\xC2\x71\x69\x86\xCF\x79\x5F\x7F\xB7\x80\x63\x01\xA1\x0F\x93\x1C\x99\x61\x62\x25\x86\xAB\x80\x20\x7D\x23\x6D\xA1\xDF\x22\xA6\x5E\x7E\x79\x85\x63\xFB\x34\xE7\x07\xFD\x26\x08\x84\x1F\x8E\x14\xF8\x46\xA9\x10\xAB\x20\x3F\x39\xEA\x1E\x06\x7E\xED\x79\x70\xE0\x47\x33\x5D\xC1\x6C\xFD\x66\xBA\x56\xF5\x6C\xFB\x30\x44\x78\xD5\x5F\x04\xC0\x09\x59\x14\xFD\x6B\x11\x09\x01\x21\x00\x31\x91\x13\x8D\xF0\x71\x0A\x82\x72\x75\xDF\x7B\x06\x76\xA0\x6E\x41\x00\x36\x00\x31\x01\xE2\x10\x9D\xEF\x50\x2D\x5A\x6F\x1A\x0B\x7B\x3D\x52\x5E\x37\xF5\xE0\x77\x49\x66\xBA\x2A\x43\x8A\xF0\x7B\x25\x36\x29\x33\x37\x00\x7C\x05\x86\x28\x58\x87\x38\x37\x52\x4B\x79\xCB\x44\x2C\x6E\x0D\x7B\xA1\x98\x22\x02\x9F\x04\x98\x4A\x0F\x6D\x87\xC5\x7C\x68\x7F\xE2\x82\xA2\xFD\x43\xAE\x73\xF9\x7C\xA7\x6C\x43\x85\xA6\x68\x66\x82\xD9\x82\x65\x03\xC5\xDB\x27\x73\x7E\x2C\x8B\xAF\x70\xB4\x80\xED\x4A\x41\x84\xB3\x00\x84\x11\x86\x1F\x98\x0E\x79\xB2\x61\x06\x85\xC1\x81\x19\x84\xED\x02\xBB\xFB\x49\x0C\x96\xC3\x7B\x30\x84\xC5\x80\x52\x80\x4C\x5C\x80\x01\xA5\xAD\x4C\x05\x8C\x0E\x75\x8A\x78\x9F\x67\x6E\x83\x3C\x7E\x86\xF6\x57\x00\x18\x22\x8A\x00\x85\x88\x86\xE8\x83\x21\x85\x16\x6F\x89\x08\xE2\xAE\x64\xF6\x71\xA9\x66\xDA\x7E\xBC\x7D\xE2\x83\xE3\x80\x77\x07\xC5\xAD\x4F\xF2\x70\x18\x82\x5D\x81\xBB\x74\x75\x82\x85\x4C\xB2\x08\xDA\x01\x9C\x3A\x15\x45\x8A\x75\x82\x6E\x83\x9B\x7E\x44\x84\x71\xFE\x0A\x11\xBA\x10\x94\xF3\x76\x6D\x84\x7B\x83\x98\x82\x53\x7C\xB7\xF8\x44\xA7\x79\xE2\x70\x6F\x7D\x4F\x80\x57\x41\x7F\x6D\xF9\x81\xB6\x9B\x33\x11\x85\xE5\x0C\x46\x88\xFB\x50\x4A\x76\x8F\x74\x29\x75\x1F\xFE\x05\x0F\x89\x17\x84\x2F\x87\xDA\x7E\xBC\x81\x6A\x7F\x5B\x77\x03\x06\x85\x0C\xB4\xF2\x47\xD5\x42\x8E\x86\x42\x04\x39\x84\x2D\x58\xD3\xE9\x0C\xF0\x54\xD9\x6E\xC0\x76\x65\x78\x02\x7C\x96\x7A\x09\x7C\x5A\xF6\x45\x9F\x6C\xAD\x7B\x30\x8F\xCC\x69\x10\x86\x32\x84\x4D\x84\xDE\x07\xB7\xE0\x6E\x1E\x9C\x3F\x88\x81\x83\xFC\x82\x06\x84\x9C\x83\x1C\x08\xBA\x0E\x90\x1F\x94\xCD\x65\xC5\x7A\xB3\x82\x28\x7D\xB3\x81\xD3\xF8\x32\xDE\x6A\x0D\x90\x29\x86\x90\x80\x22\x81\xDE\x05\x7B\x84\xAE\xB6\x66\x11\xB5\xAA\x68\x47\x85\x37\x82\x1D\x84\x79\x7E\x76\x84\xBE\x08\xEE\x11\x9A\x07\x8F\xEA\x70\x83\x7E\x31\x81\xAC\x7B\x2F\x71\xFD\xF6\x6D\x9F\x53\xB9\x74\x4D\x60\x73\x4D\x1E\x87\x47\x85\x4D\x84\x0C\xE2\x79\x11\xB1\xF8\x7B\x47\x83\xE3\x7D\x1F\x85\x8D\x7F\x7F\x84\x37\xFE\x01\x12\x9B\x25\x68\xA2\x68\xFF\x65\xD3\x80\x49\x7E\x7F\x63\x2C\x01\x87\x12\x95\x17\x00\x49\x8A\xA7\x59\xF9\x82\xAF\x82\x6A\x81\xC4\xF6\x41\x0D\xB9\xDF\x63\x36\x87\x87\x7D\xD8\x81\xB7\x81\x96\x84\x76\xCD\x26\x03\x87\x0F\x84\x74\x79\x3C\x80\x56\x70\xC6\x63\x7F\x00\xE7\xF6\x16\x0A\x89\x23\x9E\x48\x8B\x8C\x80\x27\x86\x74\x75\x7B\x71\x53\xF6\x3D\xDF\x55\xD9\x7F\x7D\x77\x65\x79\xF8\x75\x96\x7B\xE1\x77\xAF\x01\x97\x0D\xB1\x06\x8A\x5F\x71\x93\x81\x4C\x71\xFB\x74\xA1\x74\x17\x07\xAC\x1E\x36\x24\x85\x4B\x89\x90\x83\x95\x82\x77\x82\xC1\x83\xEA\x03\xE9\x11\xAC\x0F\x8F\xBC\x7A\x5C\x81\xE4\x78\xFC\x80\x0F\x68\xBE\x01\xF9\x12\xA2\x3C\x1B\x4B\x88\x90\x85\xD9\x83\xA5\x75\x67\x83\xE1\x06\xD1\x0D\xA3\x1B\x98\x26\x85\x6E\x82\x9B\x83\xCB\x76\x6E\x82\xD8\x06\xEE\xF0\x32\x0F\x91\xFE\x54\x8F\x82\x29\x87\x6C\x02\xA6\x84\xC3\xBF\x0D\x0D\xA6\xDA\x70\x4A\x87\x7F\x7A\x2A\x84\x5A\x7F\x1B\x84\x75\x01\xB9\x10\x96\x05\x54\xC8\x73\x36\x85\x24\x4C\x63\x85\xA5\x84\x66\x09\xCF\xD4\x7A\x24\x88\x3A\x8C\x93\x82\xE9\x82\x4F\x84\xA6\x83\x40\x09\xCE\x0E\x82\x25\x8E\x0F\x8B\x6E\x84\x00\x6D\xBB\x82\xAA\x59\xE8\xD4\x61\x11\x9E\x26\x9F\x2D\x01\x9B\x84\x8D\x74\x09\x83\x22\x7F\x26\x04\xC7\xFC\x68\x10\x89\xF2\x7A\x42\x83\xC9\x7C\x8A\x6D\x7F\x83\x80\x08\xAE\x13\x83", "\x27\x81\xBB\x78\xEE\x78\xCE\x81\x47\x83\xCB\x83\x1F\x05\xBF\x0C\xA1\x14\x99\x37\x83\x52\x85\xF3\x83\x4F\x83\x89\x84\x01\x06\xB3\x96\x62\x1E\x95\xC1\x7B\x09\x0E\xE2\x81\xF3\x80\xF4\x11\xAF\x09\x9F\x13\x85\x27\x88\x65\x7B\x75\x80\x39\x87\x17\x82\xE5\x84\x61\x04\xCC\x13\xA3\x11\x8E\x4E\x83\x76\x84\x3B\x76\xCA\x82\x23\x68\x92\xA9\x63\x12\xAD\x03\x97\x49\x8D\x97\x83\xD7\x83\x25\x82\x07\x82\x23\xF6\x20\x11\x8D\x11\x82\x45\x8B\x50\x84\x14\x85\x43\x82\x86\x81\x53\x04\x8C\xBD\x7F\x1C\x94\x3A\x6A\x9F\x81\xFD\x7D\x26\x84\xD8\x84\xFD\x09\x8E\x0C\x88\x1F\x9E\x31\x89\x79\x83\x3B\x87\xE6\x82\x7D\x83\xCE\x07\x96\x0C\xA0\x27\x98\x30\x8A\x83\x82\x8F\x82\x8C\x74\x3E\x82\x54\x07\x8F\x72\x4D\x28\x8E\x90\x7F\x0F\x86\x1E\x87\x7A\x85\xE4\x76\x47\x07\xE7\x11\x89\x1D\x95\x4B\x7B\x74\x85\xB4\x7D\xD3\x83\xAF\x6F\x4F\x07\xE8\x03\xA5\x1D\x99\x4F\x89\x9E\x84\x38\x85\x84\x85\x83\x83\x90\x09\xDB\x0C\xA2\x1B\x8B\x38\x8E\x65\x81\x9E\x82\xC3\x83\x73\x83\x10\x07\xF5\x09\x99\x3A\x79\x08\x70\x80\x62\x33\x0B\x0C\x4D\x1A\x85\xD4\x09\x8C\x0C\x96\x27\x91\x19\x86\x81\x81\xFC\x81\x43\x84\xFF\x83\x0F\x09\xB3\x0F\x91\x24\x95\x3D\x8B\xA1\x86\xC8\x82\x78\x85\x1D\x84\x1B\xF9\x34\xD4\x5E\xBE\x6C\x50\x88\xA4\x80\x34\x86\xC8\x60\xD1\x84\xC2\xF6\x24\x13\x8B\xF8\x7B\xEB\x7D\xE0\x78\x35\x84\x5F\x80\xD5\x84\xBD\xD5\x63\x13\x89\x09\x90\xD8\x5D\x7E\x7B\x44\x84\x29\x81\x12\x85\xFC\x09\x8E\x13\xB3\xB5\x79\x51\x89\x70\x83\x47\x87\x6A\x82\x86\x83\x04\x0A\xAD\x0D\x86\x28\x8F\x35\x88\xA0\x86\x9E\x81\xA4\x7F\xAD\x84\x00\xF8\x19\x04\xA8\x63\x70\x3F\x8F\x0F\x01\xF8\x80\xA1\x82\xE1\x84\x64\x09\x8D\x13\x84\x1D\x98\x1A\x86\x88\x84\xB8\x80\x2E\x85\x68\x84\xBA\x08\x8B\x11\x8B\x55\x7B\x1E\x8E\xFA\x71\x33\x87\x22\x68\x0B\x81\x4B\xF8\x77\x35\x56\x1F\x95\xF4\x72\xFE\x73\x30\x5E\x9B\x85\x34\x76\x23\x01\x90\x14\xB2\x29\x8E\xC3\x73\x62\x80\x40\x84\x59\x7F\x47\x83\x66\xFD\x26\x13\xB1\xFB\x66\x53\x8B\x1B\x80\x4D\x86\x91\x6A\x88\x82\x2F\x02\x92\x0A\x88\x09\x8C\xCC\x77\x97\x7B\xD0\x81\x4A\x75\xCE\x84\x89\x0A\xA2\x15\x8B\x2A\x93\x1E\x8D\xA8\x80\xDA\x80\x34\x84\x1C\x82\xD2\x08\xD4\x0D\xBB\x10\x94\x54\x8D\x60\x7D\x9B\x80\xF7\x6D\xC3\x7C\x9A\x06\xF2\xF1\x6C\x14\x89\xE8\x7E\x4F\x87\xD8\x7E\xA7\x7A\xF4\x17\x5D\x0A\xA7\x14\xA1\xB7\x6E\x46\x8C\x75\x82\xE0\x76\xD7\x82\xA1\x77\x60\x07\xF9\xD2\x62\x1D\x90\xF8\x60\x22\x80\x56\x87\x08\x85\x82\x55\x66\xF8\x0C\x10\x8D\xE6\x6F\xD9\x33\xEE\x79\x29\x85\xAE\x84\xF5\x84\x37\x0A\x96\x0F\x93\x28\x96\x37\x88\xD7\x7A\xC2\x82\x5E\x7F\xE6\x83\x7C\xFD\x46\xF0\x62\x05\x96\x0A\x87\xA5\x86\x43\x87\x12\x67\x1E\x84\xD6\xAF\x7E\xB2\x55\x09\x82\x2B\x88\xB5\x4E\xDF\x7E\x0B\x70\xC7\x78\x06\x01\x10\xE3\x7D\xFE\x60\x00\x09\x11\x86\xD0\x83\x32\x72\xC8\x70\xD1\xE6\x74\x5F\x71\x44\x75\x2C\x5E\x18\x75\x25\x69\x9F\x7C\x51\x82\xA9\xFA\x1F\xE9\x46\xEA\x6E\x08\x83\x8B\x81\x1C\x1F\x24\x7A\xFA\x57\x95\xF4\x32\xFE\x71\xD2\x6A\x8C\x28\xAF\x27\xE0\x7D\xE3\x30\x55\x7D\x4E\xF5\x03\x7E\x15\x2C\x9B\x74\x27\xB1\x80\xF9\x7C\x1C\x01\x3C\x84\xAD\xFF\x41\xBF\x5E\x04\x87\xA5\x75\x90\x1E\x63\x86\x23\x08\x90\x85\x13\x0B\xA9\x3E\x0C\xFF\x6D\x39\x55\xB2\x87\x66\x64\xD2\x07\xDF\x6F\x84\xC2\x2A\x16\x9D\xFC\x62\xFA\x7A\x29\x60\x66\x87\xF0\x7E\x9A\x51\x4D\xE6\x17\xE3\x50\x91\x24\xDC\x3A\x19\x7F\x5B\x7E\x1C\x53\xA0\x85\xE5\xF1\x4F\xF6\x73\xEC\x7F\xDA\x77\xBE\x3B\xBA\x52\xB1\x7C\x41\x3B\xC8\xFA\x7E\x7D\x7E\xEC\x6C\xD6\x74\xBA\x3A\x68\x7E\xE9\x3D\xDA\x78\xE0\x99\x52\x01\x9A\xED\x76\xD6\x79\xB6\x7B\x64\x7E\xE6\x7D\xDE\x7D\xB8\x7B\x01\xFB\x79\xDF\x0E\xD0\x4A\xB5\x84\x70\x7C\xDA\x7C\xDC\x7D\x3D\xF2\x5E\xF6\x52\xCA\x61\xE5\x3C\xB3\x78\xA5\x7F\xD4\x85\x77\x7D\xDA\xF1\x1D\xCC\x52\xEF\x35\x9B\x41\xC2\x7C\x18\x7F\xD1\x85\xCA\x7D\xCC\xA5\x5B\xE4\x79\xED\x6C\xDB\x7C\xAD\x79\x43\x61\xC3\x7C\xE9\x80\x40\x0B\xF8\x16\xA7\x97\x49\xDD\x76\x22\x7F\x1D\x7B\x69\x78\xB0\x85\x34\x86\x1A\xF6\x7B\x66\x45\x5B\x86\xBA\x7F\x6C\x86\xE5\x7D\xDC\x7D\xC9\xA6\x24\xE2\x6E\xFF\x66\xD9\x75\xB4\x84\xD1\x5C\x69\x50\xA4\x85\xBD\xFA\x68\x16\x8C\xC9\x6A\x5B\x8B\xAD\x7C\x6D\x86\xCD\x7D\x2E\x53\x1D\x01\x2C\xE4\x4D\xE3\x77\x8E\x7A\x19\x27\x87\x3C\xD0\x7C\x33\x53\x56\x0B\xC4\xF6\x49\x04\x06\xDA\x79\x56\x7C\x71\x86\xED\x7C\xAE\x85\x9A\x0B\xD8\xF5\x5C\x2E\x9C\xDD\x78", "\xDF\x03\x25\x36\x9E\x52\x22\x79\x0F\xE6\x59\x01\x93\xEC\x7E\x32\x7A\xB4\x83\x76\x85\xD4\x7D\x28\x79\x09\x01\x53\xE4\x50\xE4\x7D\x8F\x28\xB9\x87\x74\x7F\xE3\x85\xB4\x85\xBA\xFB\x4E\xE4\x74\x2E\x8B\xDC\x7C\xF3\x05\xD3\x53\xE2\x85\xE2\x85\x8E\x0B\xF9\x16\x84\x2E\x89\xD7\x7C\xB7\x84\xD7\x50\xCF\x06\x52\x3E\x59\x0B\xD0\x17\x9F\x03\x83\x5C\x80\xB9\x80\x73\x7D\xFB\x7F\xAF\x85\xF8\x0D\x70\x00\x49\xCA\x6B\xD5\x77\xCF\x1A\x7B\x84\xEC\x85\xE3\x85\x9B\x0B\xC9\x17\x9A\xEB\x6B\x5E\x8C\x1E\x79\x43\x60\xEC\x7C\xC0\x85\xE5\x0B\x82\x17\xA2\x2C\x58\xDB\x73\xF4\x02\x6F\x7F\xA1\x78\xF0\x5E\x7C\xE1\x0F\xE3\x4D\x83\x78\x01\x85\xB7\x79\x7A\x87\x09\x74\xB3\x7A\x0A\xEF\x1B\xB0\x70\x2F\x88\xF4\x16\xBE\x86\x5C\x7D\xCC\x7D\xC3\x7D\x85\x0B\x89\xF7\x73\xF1\x21\x5F\x83\x2A\x79\xEE\x06\x41\x71\xDD\x4C\xFC\x0B\xB6\xCB\x59\x2E\x88\x5F\x88\x1F\x78\x54\x7B\xC2\x7C\xED\x7D\x25\xD1\x7A\x17\x99\xEA\x74\xB4\x0B\xA9\x7D\x18\x7B\x62\x68\xA2\x85\x09\x01\x35\xF5\x57\x07\x8B\x33\x7D\xC1\x87\xE0\x51\xC5\x7C\xF5\x85\xFC\xFA\x35\xF6\x6A\xAC\x3E\x06\x71\x41\x7C\x11\x72\xD0\x7D\xB6\x85\xB0\xF1\x6E\xF5\x4B\x1C\x2D\xD6\x76\xB5\x85\xBB\x53\x6E\x4D\x5E\x78\x78\xCC\x03\x4D\x48\x2F\x91\x5C\x8B\xBA\x7F\x70\x84\x03\x87\xE2\x78\x62\x0B\xC7\xE3\x70\xC7\x6C\x05\x81\x67\x75\x1F\x71\xF7\x84\xD5\x7D\xDF\x0B\xAC\xF7\x7D\xEE\x70\x61\x80\x0F\x5D\x74\x86\x76\x52\x9C\x20\xF1\xFA\x74\x16\xB7\x96\x45\x61\x85\x6C\x56\x04\x77\xFC\x84\xAF\x85\x4A\x0C\xBF\x18\x8E\xCF\x6A\x31\x5A\x73\x2F\x86\x84\x15\x86\x85\x70\x56\x0C\xA0\x4E\x58\x31\x9E\x61\x89\xCF\x08\xC7\x53\x82\x79\x01\x86\x1C\x0C\xC5\x18\x95\x99\x47\x62\x89\xC0\x85\x87\x86\x7A\x78\xC4\x85\x5B\x0C\xA7\xF6\x6B\x07\x88\x37\x5F\xC5\x84\x1F\x73\x1A\x87\x1D\x86\xDE\x0B\xCA\x17\x91\xED\x69\x91\x7C\x78\x09\x67\x7F\xB1\x7C\xF0\x00\x4C\x0C\xC1\x56\x54\xE1\x06\x5D\x89\x57\x33\x46\x7B\x26\x09\x1A\x79\xE4\x0B\xCA\x29\x35\x31\x8D\x8A\x67\xC7\x81\x7D\x84\x0F\x87\x24\x86\x64\x0C\xCC\x4D\x44\x3D\x17\x5D\x83\xC5\x82\x8D\x85\x56\x68\x64\x53\x79\x0C\xEB\x17\xBF\x2E\x81\xDB\x71\xBC\x85\x92\x85\x0E\x86\x23\x86\x78\x0C\xC8\x18\xBA\x31\x80\x5F\x8C\xBC\x84\xE8\x06\xF3\x85\x44\x86\x69\x0C\x9F\x19\x8D\x32\x92\x5D\x88\xC2\x84\x66\x7C\xD8\x7D\xEB\x85\xBE\xA6\x5E\x18\x96\x32\x8B\x8B\x78\xC9\x82\x94\x86\x26\x86\x52\x86\xED\x0B\xFF\x4D\x5E\xEE\x7E\x64\x83\xC9\x62\x04\x83\x2A\x87\xAE\x7D\xAD\x0C\xCC\x16\x94\xA0\x6E\x5F\x83\x6D\x1C\x97\x87\x3E\x70\x46\x86\x97\x0C\xFA\x16\xB5\x2F\x95\x5E\x86\x72\x50\x7F\x85\x06\x87\x80\x85\xCD\xE0\x23\x01\xA5\x34\x76\x63\x89\x15\x68\xF3\x73\x4B\x48\x91\x7C\xC4\xD0\x5C\x14\x12\x33\x99\x95\x6A\x0A\x84\x82\x84\xD6\x01\x3B\x79\x17\x0C\x80\x18\x88\x3D\x0F\x60\x88\xCA\x83\x2C\x6B\x22\x86\x08\x80\xBF\x0C\x88\x18\x94\x2F\x89\x8A\x6A\xB8\x7C\x7F\x3E\x2D\x3F\xE7\x30\x93\xAB\x5B\x19\xA9\xFA\x65\x8C\x61\xC6\x81\xD2\x47\x0A\x86\x62\x3E\x74\x71\x46\xF9\x0D\xF3\x24\x38\x0F\x6D\x53\x99\x3C\x33\x81\x93\x7F\xAE\x62\x4F\xF9\x30\x33\x81\x13\x62\xCF\x82\xFF\x76\x2F\x87\xAC\x68\xD3\xA5\x74\x4D\x48\x8B\x36\x37\x5B\xCF\x87\x0A\x05\x3F\x87\xAF\x58\xF8\xA6\x77\x4D\x62\x33\x8D\x1C\x3F\x87\x83\x74\x87\xD2\x53\xEE\x7B\xA3\x0A\x9E\xE0\x58\x27\x99\x29\x8A\x9D\x83\xA7\x80\x77\x85\x9E\x82\xDE\x09\xFF\x0B\x95\x29\x87\xE7\x70\x89\x82\x4D\x82\xD9\x81\x75\x7E\xCB\xE1\x59\xF8\x7A\xAB\x60\x0A\x82\x14\x80\xE0\x82\xE6\x52\x8C\x86\xBB\x0A\xCE\x0D\xA0\x1B\x9A\x51\x82\x99\x84\x47\x84\xB9\x82\x1F\x85\xE6\x06\xAE\x0D\xA8\x1B\x92\x17\x81\x9D\x81\xB7\x76\x45\x85\x93\x86\xB5\x05\xA9\x1A\xA7\x5A\x78\x2D\x8D\x8A\x87\x7F\x5B\x2B\x85\x7E\x81\x95\xE3\x30\x02\xAC\xE1\x78\xE5\x64\xAA\x80\x06\x86\xA9\x85\xD2\x81\xBF\x06\xA7\x07\xAA\x2A\x89\x1D\x8C\xAA\x81\x3C\x82\xAB\x84\xA0\x75\x8E\xFC\x50\x0B\x90\xF2\x6C\x2F\x8B\x64\x7B\x92\x7C\x4B\x60\xA5\x86\xEF\xF7\x09\x0D\x8E\xFB\x75\x40\x8B\xD1\x81\xBF\x81\x47\x87\xFD\x82\x1F\x0D\xFD\x0B\xA1\x34\x84\x32\x83\xD2\x84\xE7\x82\xA0\x7B\xA0\x75\xB8\xF8\x43\xD6\x5C\x23\x8D\x29\x8B\xFC\x64\x95\x7F\x43\x5C\xB0\x86\x38\xF6\x19\x1A\x93\xBF\x6D\x52\x8C\x90\x87\xAC\x84\xDC\x83\xB4\x86\x72\x07\xEB\x1A\xB4\x1D\x8D\x6B\x86\x77\x83\xE2\x7A\x5C\x80\x93\x7B\x78\x0D\xCF\xEC\x52\x2B\x80\x76\x79\xA2\x83\x24\x87\x8A\x85\xE3\x82\x2D\x0A\xBC\x11\xAF\x28\x96\xB7\x71\xA3\x82\x2B\x6E", "\x6B\x56\x65\x81\x2E\x04\xAF\x1A\x8B\x35\x9E\xEF\x6A\xD1\x83\x5D\x84\xE6\x83\x76\x85\xF8\x06\x97\x14\x9D\x27\x99\x50\x8C\x6F\x84\xB0\x86\x8B\x4F\x16\x83\xF6\x02\xDE\x05\x92\x26\x66\x5C\x73\x4F\x16\xE1\x3F\x60\x5D\xC4\x86\x63\xF6\x0B\x1B\x91\xD9\x77\x45\x84\xF2\x68\x52\x84\x05\x6D\x69\x84\x8C\x08\xC4\x15\xBD\x10\x96\x54\x89\x4D\x46\x1D\x7D\x9E\x58\x98\x84\xFF\xF8\x32\x12\xBD\xBF\x6C\xE8\x71\x9D\x80\x00\x54\x4C\x86\xAC\x83\x5B\x04\xE5\x11\xB3\x26\x8A\x51\x85\x9B\x84\x45\x87\x6D\x84\x17\x85\xB9\x09\xB0\x14\xBB\x26\x96\x13\x74\x94\x84\xD9\x79\x37\x85\xFA\x71\x47\x09\xC2\x0F\x9A\x36\x81\x6B\x8C\x71\x84\x02\x84\xE0\x82\x39\x83\x80\x09\xE0\x0B\xAA\xF1\x62\x2F\x8C\xC6\x78\x25\x87\xFB\x81\x5F\x84\x23\xF7\x2C\x12\x90\xA1\x3F\xED\x66\x99\x5A\x2B\x85\xB2\x84\x4A\x71\x5D\x09\xD3\xD7\x71\xF3\x70\x6D\x84\x70\x7E\x4B\x84\x10\x62\x38\x82\xB8\xFD\x28\x15\xBA\xF6\x75\x41\x8E\x85\x7D\xAA\x85\x7D\x81\xAB\x86\xED\xF8\x72\x12\xAB\x27\x19\x34\x8B\x64\x81\x01\x87\x3C\x7D\xC0\x81\x9D\x01\xEA\x6C\x59\xF5\x75\xB8\x77\xFC\x37\xB8\x86\xDA\x82\xDA\x7E\xEA\x0A\xFF\x13\xB8\x37\x8F\x20\x81\xD5\x81\x82\x83\x54\x87\x09\x82\xFE\x0D\xFC\x03\x80\x38\x8C\xEB\x7F\x3D\x87\x3A\x5F\x5D\x86\x07\x87\x13\x08\xE3\x1A\x9F\x37\x8B\x48\x89\xE5\x78\xF6\x80\xEF\x81\xFF\x83\x55\x05\xD3\x14\xBD\xFA\x67\x39\x8F\x81\x80\xB0\x7C\xD1\x06\xCC\x4E\xE1\xA9\x20\x1C\xB5\x14\x8B\x3B\x88\x31\x85\xAC\x86\xDB\x82\xBF\x86\x19\x08\x80\x1B\x9B\x20\x82\x6C\x87\x7E\x86\xB4\x85\xFA\x83\x37\x60\xDA\x06\x9E\xDC\x74\x37\x98\xB8\x72\xDB\x80\xFC\x79\x76\x85\x0A\x85\x1E\x0D\xA2\x1B\xA0\x34\x84\x6D\x8E\x79\x83\x5E\x84\xE8\x83\x7A\x85\xCC\x04\x9F\x14\x86\x6C\x71\x0E\x86\xA6\x67\xD1\x0E\x8C\x87\x05\x82\xA2\x03\x92\x1C\xA0\x29\x89\xF0\x72\xA6\x80\xD8\x80\x99\x85\x6B\x81\x19\x0E\xD9\x05\x9E\x10\x50\x4E\x86\xD1\x87\xFB\x53\x95\x87\x19\x82\x8F\x09\xB3\x1A\xB5\x29\x95\x69\x87\xA7\x85\x47\x84\xAB\x83\x1F\x85\x3A\x0D\xC1\x14\xA9\x1B\x96\x3C\x6A\xA6\x84\x56\x85\x79\x84\xEF\x80\x6E\xFD\x3D\x10\x27\x39\x9A\x22\x82\xE4\x7A\xB9\x84\x5A\x84\x7D\x84\x6A\x09\xFC\x11\xAC\x25\x9E\x47\x8E\x96\x80\x20\x84\x5C\x85\xA7\x6A\x2E\xF9\x29\x53\x7B\x39\x94\x3C\x8D\x58\x81\xCB\x80\x9D\x85\xD4\x82\x0A\x07\xED\x1C\xB7\x34\x8F\x73\x89\xD3\x83\x4F\x87\x4E\x87\x3E\x85\x73\xDD\x16\xEF\x43\xE8\x43\x72\x88\x78\x7D\xC8\x87\x77\x7F\xF0\x86\x74\x06\x8F\xFB\x69\xE0\x77\x33\x8C\xEB\x7B\x96\x82\xAF\x7F\x16\x87\x1D\x0A\xD1\x1C\x9C\xB3\x74\x09\x43\x05\x6D\xCC\x64\xA7\x87\xCC\x7B\x9E\x0E\xAC\x09\x90\x61\x6E\x25\x8B\x8D\x6E\x24\x85\x88\x7F\xC2\x84\x91\xF7\x7A\x0C\x93\xDE\x68\x08\x43\xA3\x87\xC3\x87\x66\x87\x20\x6F\x9D\x0D\xDA\x1C\xBD\x1A\x8E\x34\x85\xE1\x83\x8E\x83\x85\x87\x3A\x82\x61\x0E\xAB\x07\x95\x1A\x90\x4B\x60\xB1\x87\x1F\x01\xDE\x82\xA9\x81\xCA\x07\x0B\x1D\xB9\x1A\x81\x31\x81\xE1\x85\x54\x87\x84\x87\x00\x85\xFA\x0D\xB4\x10\x87\x3B\x9D\x24\x89\xEC\x85\x82\x83\xB2\x87\x7A\x7F\x60\xF7\x5D\xD9\x4E\x1E\x84\xB6\x5F\xEA\x83\xF5\x79\xAC\x87\xBF\x84\xB3\x0E\x83\x0F\xAF\x12\x96\x75\x87\x37\x80\xD7\x87\x88\x7E\xF4\x86\x0C\x02\x92\xF3\x75\x39\x9A\x28\x63\x95\x7C\xC6\x82\x94\x02\x69\x87\x30\x07\xBA\x0D\x92\x28\x82\x76\x8E\x94\x84\xD8\x85\x97\x86\xA9\x86\x5F\x0E\xC2\x0D\x9D\x3B\x97\x23\x8F\xED\x85\x42\x83\xF4\x83\x1C\x81\xE3\xF0\x3D\x0F\xAA\xE5\x7F\x4A\x86\xA8\x87\x56\x85\x83\x87\x5F\x87\x71\xDF\x59\x1C\x96\x3B\x9B\x72\x81\x47\x85\xD8\x87\x26\x83\x6D\x87\x29\x06\x83\x1E\x9F\x12\x85\x78\x89\x02\x7F\x9E\x80\x02\x84\x94\x70\xFA\x04\xB1\xBE\x56\xFA\x73\x6F\x88\xEF\x85\xBE\x82\xBE\x86\x1C\x85\x6A\x0E\x90\x1D\xB6\x29\x8A\x35\x8E\xE6\x85\xE1\x81\xA5\x86\xAA\x84\xA5\x08\x9C\x1E\x93\x71\x69\x29\x89\xA9\x87\x23\x6F\xFE\x77\xBA\x7C\xE2\x0A\xB5\x15\x96\x06\x88\x4A\x83\x8B\x15\xE4\x86\x58\x87\x98\x83\x23\x0E\xFB\x0F\xA5\x38\x9D\x3F\x82\x72\x81\x4A\x85\xF9\x82\x1E\x87\x02\x08\xBE\x1C\x84\x20\x8A\x3F\x86\x80\x84\xA0\x76\x81\x87\x65\x85\x9D\x06\xCE\x15\xB6\x3B\x9A\x73\x80\xF1\x86\x53\x73\xA8\x7A\xBE\x86\x43\x0F\xCF\x14\x85\x3D\x9A\x71\x80\x91\x80\xE9\x85\x07\x84\xA5\x87\xA8\x0E\xCC\x1E\x98\x25\x8E\x7A\x88\x99\x7F\x48\x82\x51\x82\x13\x84\x2F\xF0\x45\xD5\x4F\x3C\x9C\x6E\x8B\x7A\x86\xBB\x86\xFE\x82\xAC\x87\xBA\x03\xA6\x1C\xB5\x19\x88\x71\x84\xEA\x84\xF6\x83\x8A\x86\x0F\x84", "\x7B\x06\xB6\x09\x91\xA6\x7D\x2A\x89\xAF\x84\xF4\x6F\xBE\x84\xCD\x7C\x57\x02\x9C\xF3\x41\xE2\x49\xC6\x7C\x1A\x82\x2C\x72\x6E\x86\x47\x84\x64\xE8\x25\x1A\xBF\x05\x9B\x09\x84\xB8\x70\xC6\x78\x25\x84\x96\x86\x84\x0F\xA9\xCF\x3F\x09\x80\x52\x88\x99\x81\xF1\x87\xBC\x80\x21\x71\xB6\xD9\x0C\x1F\xB3\xB8\x6E\x7C\x8D\x14\x80\xB4\x74\x1B\x74\xDE\x82\xB6\xFA\x29\x18\x0D\x22\x97\xB7\x7C\x22\x80\xBD\x80\x01\x33\x61\x84\xC7\xD6\x45\x11\x92\x0C\x9D\x8C\x36\x26\x87\xF0\x84\xE9\x86\x21\x81\x23\x03\xDF\xEE\x07\x3F\x7B\x46\x87\x32\x84\x59\x86\x37\x84\xBB\x86\x5F\x01\xF1\xDA\x13\x3E\x91\x73\x85\xF9\x81\xE2\x83\x55\x51\x57\x74\x23\x0C\xAD\x1F\x95\x23\x95\x54\x87\x8D\x86\x15\x84\x1B\x75\xA8\x81\x29\x02\xA2\x1F\xAE\x3E\x8D\xEB\x67\x8A\x81\xCD\x5E\x8B\x83\x7B\x81\x82\x01\xED\xF9\x44\x06\x97\xB0\x77\xE3\x73\xE7\x84\x90\x42\x2E\x05\xBB\x0F\x96\x1D\xB2\x39\x90\x35\x89\x8A\x82\x90\x38\x7B\x87\x24\x83\xB2\xF6\x6F\x1B\x88\x0F\x83\x6A\x68\xE0\x81\x73\x81\xA0\x58\x8E\x62\x85\x0F\xD9\x1F\xB0\x3C\x87\x50\x86\x95\x86\x16\x7D\x39\x7D\xA2\x84\x09\x0E\xBB\xD7\x7C\x3F\x62\x35\x3E\x06\x73\xF4\x85\x65\x86\x94\x6E\x80\xEE\x6D\x1B\xB0\xE3\x60\x54\x84\x1B\x87\xF7\x82\x6D\x80\xDF\x61\x1C\xC5\x74\x1F\x9A\x74\x16\x7F\x83\xDD\x81\xDF\x78\xE9\x6B\x4E\x77\x75\x09\xC0\xD2\x77\x25\x8C\x1E\x83\x14\x85\xFE\x87\xF2\x87\x02\x88\x18\xEA\x44\x1E\x06\xCC\x41\x20\x67\x19\x83\x00\x8B\x03\x89\x43\x87\x43\xC0\x47\x0D\xAF\xE7\x48\x4B\x38\xFD\x84\x00\x88\x06\x88\x12\x68\xAC\x09\x94\xD4\x2A\x3F\x9A\x78\x8B\x62\x82\xE6\x85\x1E\x82\x55\x87\x9C\xEF\x49\xEE\x54\x39\x93\xC5\x73\x02\x8A\x5E\x84\x0E\x84\xDD\x49\x5C\xF7\x1C\xE4\x6D\x40\x8F\x3E\x8E\xE4\x81\xFA\x81\x9A\x84\x2C\x85\xE6\x0F\xA5\x9C\x78\x39\x81\x10\x82\xFC\x87\x32\x87\x65\x83\xE2\x87\x44\xDA\x33\xDE\x45\xDE\x6A\x0E\x89\x9B\x33\x06\x8A\x86\x85\x1A\x88\x41\x05\xD8\x0C\x67\x11\x81\xBA\x51\xFA\x85\xED\x02\x07\x88\x26\x7F\x0C\xB7\x3D\x13\x9A\x42\x7C\xC9\x7C\x03\x8A\xF9\x87\xF0\x87\x62\x85\xBC\x0D\xAD\x1B\x83\x6E\x72\x57\x66\xB9\x82\x48\x36\x11\x89\xD2\x86\x48\x10\xE1\x13\xAF\x35\x9F\xE0\x7E\xEC\x84\xC7\x7D\x13\x88\xC3\x87\x57\x10\xBB\x1B\x80\x41\x92\x1F\x51\x75\x81\x06\x6B\x81\x81\x2D\x85\x4E\x74\x3D\x20\xA1\x19\x9D\x7D\x82\xA4\x82\xDE\x84\x0E\x89\x33\x83\xA4\x07\x8C\x32\x5D\x40\x97\x80\x80\x05\x88\x13\x6A\xC7\x87\x0A\x6B\xDB\xD5\x01\xF0\x43\x2A\x99\x79\x8A\x3D\x70\x2F\x7D\x0A\x4B\x3D\x88\x69\x10\x88\x1F\xBE\x3E\x9E\x53\x88\xA9\x80\xD5\x7E\xA6\x85\xFB\x6A\xF9\xCE\x1D\x15\x81\x40\x92\x7C\x8F\x04\x8D\x8C\x83\x8D\x81\xF5\x83\xD4\x07\xBB\x01\x84\x22\x64\x54\x82\x7F\x80\x7C\x40\x22\x88\x1F\x88\xD7\x06\xEB\x20\x8C\xAA\x48\x56\x85\xE0\x85\x3A\x68\xD4\x87\xF8\x87\x16\xF0\x13\x21\xA6\x97\x3F\x82\x8D\xE4\x87\x05\x8B\x93\x86\x6D\x67\xDE\x0A\xA6\xAF\x49\x59\x67\x7B\x8F\x95\x87\x04\x85\x13\x34\x4A\x88\x7C\x10\x96\x21\x91\x41\x8D\x83\x83\x1D\x44\xEF\x85\x15\x59\xAF\x82\x76\xF0\x41\x10\xBE\xE1\x46\x23\x7B\x66\x6A\xC7\x7F\x3F\x00\xB1\x08\xAB\x0B\xA3\x05\xB7\xE6\x71\x44\x8E\x38\x54\x4D\x82\x6C\x38\x49\x24\xCB\xF9\x16\xCA\x14\xCF\x31\xCE\x71\x07\x79\x50\x80\x33\x89\xE0\x40\xCE\x10\xB4\x26\x44\x23\x28\x15\x84\x87\x87\x7E\x68\x10\x09\x39\x00\x8C\x02\xD1\xC0\x49\x04\x0C\xFB\x22\x16\x6E\x17\x3E\xE0\x38\x37\x6C\x35\x00\x33\x05\xBB\x63\x4C\x35\x35\x07\x01\xD2\x71\x21\x00\x06\x5F\xEF\x10\xB1\xEB\x39\x0A\x87\x34\x03\x47\x44\x57\x82\x1C\x00\x5F\x81\x8B\xDA\x41\x05\xA2\x47\x49\x15\x8F\x0D\x89\x1C\x8A\x46\x79\x69\x1B\x91\xE6\x66\x21\xAC\xCA\x28\x87\x8A\x0E\x89\x27\x4C\x3B\x88\x77\x88\xF0\x10\xA8\xEC\x33\x43\x99\x0B\x05\x0F\x8E\xA2\x31\xD9\x07\x7B\x88\x70\x6C\x01\x16\x04\x5D\x7A\x87\x83\x3F\x4D\x0C\x87\xF6\x7D\x66\x70\xC7\x02\xF1\x0B\x9D\x1B\x96\x3F\x8D\x0D\x8D\x76\x37\x3D\x52\x3B\x00\x69\x08\x95\xFB\x0F\xC2\x63\x08\x0F\x21\x6F\x2A\x7B\x59\x7B\x5A\x7A\xB9\x0B\xF2\x2C\x1F\xEF\x6E\xA4\x47\x31\x03\xE8\x7D\x79\x18\xF2\x79\x58\x8D\x71\xEA\x51\xCF\x7C\x52\x04\x58\x81\x07\x75\x9B\x49\x62\x7A\x1A\xF5\x15\xF2\x74\x44\x8B\x89\x89\x46\x4F\x62\x01\xD4\x7F\x27\x7D\x65\xFA\x70\x78\x54\xE8\x6C\xAE\x75\x13\x8E\x7C\x7D\x9B\x48\xC2\x7A\x65\xAC\x31\xFF\x71\xCB\x6E\xA6\x77\xB5\x87\x9F\x71\x51\x89\x43\x74\x47\x11\x90\xE8\x64\xD3\x6C\x86\x49\xF7\x79\xA0\x78\x65\x7A\xA7\x88\x3C\x11\xA0\x27", "\x73\xE8\x7A\xAC\x75\xA3\x7A\x48\x7E\xE0\x7F\xD2\x7F\xB3\xFF\x66\xE5\x7F\x06\x8F\x8A\x8F\x89\x71\x2A\x8B\x3E\x7A\x96\x47\x9B\xF5\x48\xE3\x03\xE9\x71\xD0\x73\xFB\x7E\x48\x7C\x71\x80\x95\x88\x37\xEA\x4C\xF4\x6C\x8A\x77\xA1\x7D\xF8\x78\xBE\x70\x1C\x5E\x29\x7D\x44\x11\xD9\x22\xA2\xA7\x66\x03\x04\x51\x7B\x72\x7D\x5D\x89\x88\x79\x7A\xFF\x0A\xE6\x51\xFE\x71\x6B\x34\x16\x8B\x16\x76\x59\x88\xD2\x79\xAD\xAC\x74\x57\x55\x45\x93\xAC\x7A\xDC\x43\x30\x8B\x7E\x35\xC2\x88\xFB\xE8\x11\x26\x62\xFE\x7D\x9F\x74\x39\x79\x8E\x5F\x31\x48\xC8\x88\x2C\xE9\x12\x23\xB5\xE9\x6C\x22\x5F\x17\x89\x76\x79\x60\x88\x94\x48\x2B\xF3\x3A\xE6\x70\x45\x97\x4C\x75\x33\x4E\xBC\x7B\x0E\x80\xF4\x7A\x98\x11\xC6\xD2\x67\xEF\x7F\x60\x57\x47\x78\xA8\x78\x8B\x33\x1B\x75\xC7\xFF\x36\x16\xB9\x44\x9F\x92\x6B\x13\x8F\x46\x76\xF3\x7E\x77\x79\xFC\x8D\x7B\xEB\x45\xFD\x7F\xD4\x7E\xB9\x7E\xE1\x7E\xDF\x54\x2B\x84\x3D\x4D\x65\xB0\x0B\xEF\x64\xD1\x4E\xFF\x7F\xDF\x73\xA4\x69\x8E\x73\x9B\x00\xBF\x23\x8E\x7B\x0B\x02\x23\x9C\x49\x34\x6D\x71\x7E\x6F\x01\xE5\xE6\x6D\x0A\x98\xF2\x6F\x2B\x82\x7B\x69\x0E\x86\x8B\x59\x81\x00\xDC\xD2\x44\x14\xAE\x82\x7A\x60\x85\xCE\x80\x0E\x87\xA5\x78\xDF\x12\x83\xE1\x1A\x22\xAF\x94\x61\x7B\x33\x7A\x77\xF5\x34\x62\x71\xEE\x88\xB3\x08\xBE\x4B\x0D\x2C\x8D\xD0\x79\xA8\x7A\x86\x7F\x74\x4B\xEA\x4A\x32\xFC\x3E\x16\xB6\x2D\x9C\x52\x03\x87\x85\x62\x81\x93\x19\xF0\x88\x53\x06\xEC\x23\x86\x86\x72\x09\x87\x1E\x88\x8D\x87\x2D\x05\xA5\x82\xC8\xD0\x2F\x02\x2B\x47\x9E\xCF\x7F\xB0\x82\x25\x81\xDC\x07\x9A\x22\x78\x00\x21\x22\x98\xF4\x30\xFF\x7E\x3C\x5A\x41\x8A\xFE\x37\x99\x80\xB0\x81\x5C\x14\x14\x43\x86\x6F\x8B\x5C\x82\x25\x84\x72\x57\xE6\x87\xD9\xDD\x50\x1F\xAB\x22\x8A\x69\x8F\x13\x82\x23\x86\x26\x7C\xCC\x86\xF1\x88\x12\x24\xBE\xB3\x7A\x4B\x76\x8D\x85\x32\x6E\xE2\x87\x9F\x86\x92\x08\xA3\xF1\x5D\x3E\x98\xC4\x7F\xF9\x80\x16\x87\x58\x40\x11\x89\x87\x07\xA4\x24\x84\x3F\x8B\x84\x83\xA4\x85\xBA\x75\xCA\x75\xEB\x76\xAA\x0F\xDD\x02\x9A\xB7\x76\xD3\x30\x23\x8E\xDD\x85\xDE\x80\x0B\x89\xB0\x0F\x99\x0C\xA4\x0C\x82\x5A\x77\x16\x82\x17\x7E\xFF\x87\xA7\x5F\xB8\x0F\xD2\xED\x03\x04\x13\x90\x88\x67\x83\xB2\x7E\xAE\x87\xCA\x7E\xC0\xFC\x7A\xF7\x44\x18\x9C\x90\x7C\x24\x8D\xD4\x85\x9E\x83\x53\x87\x79\x0F\xB1\x1F\x99\x08\x68\x7E\x81\x22\x8D\x68\x7F\x88\x89\x6D\x85\x7C\xDF\x28\x1B\x9B\x16\x8F\x31\x86\x24\x71\x23\x85\xDA\x81\x6A\x7C\xFC\xCF\x01\x16\x3D\x48\x94\x90\x86\x98\x80\xDE\x85\x4F\x67\xBE\x81\x8F\x01\xE1\x1F\xA5\x42\x92\x47\x73\x19\x81\x07\x8B\x42\x7E\x33\x48\x02\x10\x86\x02\x15\x49\x96\x7B\x86\xEA\x84\xC5\x85\x96\x88\x21\x89\x30\xF5\x66\x0C\xA3\x1E\x82\xE8\x4C\x51\x62\x4D\x8A\x97\x89\x18\x89\x60\x12\xBF\xC6\x7C\x19\x98\xE9\x73\x78\x6F\x6F\x80\xF9\x86\xE5\x81\x5F\x09\xE1\x12\xA2\xF8\x46\x2F\x3B\x27\x8A\xC5\x85\x9F\x88\xBC\x87\xBB\x0E\xFF\xDC\x70\x06\x83\x70\x84\x97\x81\xB8\x86\x5D\x85\xFE\x77\x78\x09\x9D\x04\x82\x04\x15\x94\x8E\xF5\x82\x22\x85\x18\x88\x0E\x85\xC1\x8F\x1D\x1C\x94\x40\x82\x95\x81\x10\x04\x54\x88\x93\x87\xEF\x84\xA7\x12\xD6\x14\x88\x3F\x42\x5B\x8B\x01\x8B\x45\x3B\x92\x89\x2F\x89\xF4\x09\xDC\x15\xA6\xA6\x41\x81\x82\x00\x3B\x4D\x89\x93\x89\xF2\x82\x4F\x12\xE7\x0B\xBA\x3D\x8C\x3C\x8A\x02\x8E\xDD\x81\x17\x89\xB8\x36\xAE\x12\xF1\x15\xB4\x40\x8E\x85\x89\xD0\x44\xCC\x86\x31\x46\x5F\x89\x56\x12\xCE\x24\x98\x49\x99\x94\x82\xDD\x7E\x5E\x84\x82\x65\xB8\x7B\x54\x12\xB8\x25\xAF\x25\x9D\x83\x89\x01\x89\xD1\x84\xEB\x87\x51\x89\xDA\x12\x86\x1D\x9C\x4B\x92\x51\x8A\xA0\x84\x26\x7C\x79\x3E\x68\x89\x7C\x12\xD7\x24\xBE\x49\x94\x96\x8B\x4C\x86\xDE\x7C\xD4\x66\x2A\x88\x67\x10\xC9\x25\xA5\x29\x8E\x81\x89\x9A\x84\x5E\x86\x12\x89\x5E\x87\xF8\x6D\x37\x25\x88\x4A\x99\x95\x8C\xF7\x6A\x33\x81\xB3\x87\x67\x87\xD7\x0F\x87\x25\xBE\x48\x88\x3C\x80\x24\x8B\x6F\x83\xB0\x88\x29\x87\x21\xCB\x39\x09\xBC\x48\x82\x98\x8C\x26\x89\xD7\x87\xB4\x88\x28\x89\xD5\x12\xA8\x20\xAE\x8C\x65\xF3\x74\xB6\x7C\x52\x89\xB8\x89\xA0\x84\x1F\x10\xDA\xB2\x57\xE5\x62\x7F\x8A\x44\x5A\x50\x85\xF8\x6C\x42\x85\x0D\x0F\xE8\xE7\x29\x9E\x32\x97\x80\xE6\x84\x5E\x8B\x99\x84\x7B\x89\xAF\x0A\x8D\x21\xBE\x90\x50\xF9\x64\xB5\x5B\xE4\x85\x9A\x89\x91\x89\x17\x13\xBA\x13\x99\x4C\x88\xE9\x63\xF6\x68\xF0\x6F\x0C\x7D\x12\x84\x5F\x09\x9D\x21\x9B\x9F\x30\x99", "\x8B\x2F\x8B\x5B\x8A\x2E\x88\x3F\x88\xB1\x10\x89\x20\xB2\x58\x68\x55\x76\xEC\x7E\x0C\x4A\xA1\x89\x64\x88\x3D\x13\xE2\x25\xBF\x4C\x83\x02\x65\x33\x8F\xFF\x7B\x2C\x88\x17\x78\x4B\x02\x9D\xCA\x30\x1B\x08\x97\x86\x29\x8A\x5D\x88\xA6\x88\x88\x89\xED\x12\xE0\xEE\x7E\x42\x81\x7B\x5C\x87\x5E\x4A\x83\x58\x82\x2C\x81\x6D\xE4\x70\x00\x45\x29\x1C\x14\x85\x0D\x88\x09\x7A\x97\x81\xF9\x49\x7D\xBE\x2F\x1F\x31\x3E\x06\xCD\x2B\x92\x34\x59\x04\xD9\x88\x2E\x81\x66\x13\xF6\x04\x92\x50\x49\x9B\x8D\xFE\x00\x36\x08\x17\x27\x95\x34\xA3\x06\x6F\x26\xB4\x09\x91\x9B\x83\x5B\x81\xC2\x24\xDD\x89\xB7\x32\xC6\x0F\x6C\x26\x96\x94\x25\x27\x0A\x37\x88\x50\x80\xDF\x89\x6B\x88\x7E\x13\xAE\x9F\x6F\x3E\x0A\x61\x22\x38\x8C\xE7\x05\x9C\x03\xC2\x89\x76\x0B\xCB\x21\xA6\x34\x8B\x15\x5F\x37\x88\x21\x36\xF5\x07\xC6\x89\x44\x0F\x43\x0A\x10\x4E\x99\xA3\x32\x39\x8B\xF1\x84\xF5\x4D\xCA\x89\x80\x65\x38\x23\x26\x66\x3D\x88\x8A\xA8\x7E\x14\x40\x1F\x00\x7F\x88\x60\xF1\x23\x71\x51\x9A\x79\xC5\x32\x38\x39\x22\x6E\x0D\x01\x82\x88\x5A\x9E\x2C\xCD\x3E\x01\x11\x34\x70\x09\x04\xC1\x5D\xED\x88\xF6\x3A\x0B\x11\xA0\xCE\x06\x3D\x3C\x15\x8B\x07\x00\x1F\x88\xF5\x6C\x8A\x88\x8B\x93\x7C\x21\xB4\xF4\x2A\x86\x86\x0D\x8B\x72\x88\x5C\x41\x6C\x88\x11\x72\x46\x9C\x34\x38\x35\x09\x76\x10\x05\x0F\x03\xEA\x88\x33\x69\x58\xE7\x69\x04\x9E\x4E\x9B\xC7\x48\x3C\x8C\x5E\x06\xF2\x89\x8F\x4B\x2F\x09\x2E\x27\xB0\x4E\x99\x07\x52\x3B\x8C\x76\x88\xF4\x89\x38\x55\x8E\xBE\x08\x27\xBB\x38\x35\x9E\x82\x30\x2E\x2B\x00\x8D\x27\x97\x04\xB7\x13\xE0\xEC\x39\x4E\x8B\x53\x4C\x3B\x8B\x8E\x36\xC3\x68\xEE\x71\xE1\x13\xC6\x27\xA5\x3C\x24\x9F\x81\x10\x07\x7A\x8B\xE3\x31\x80\x05\x53\xD9\x40\x27\x8F\x4F\x48\x88\x7B\x35\x7A\x20\x03\x1F\x00\x07\x89\xA4\xDC\x3C\x6F\x40\x02\x03\x15\x8C\xA5\x00\x24\x8A\x0E\x7F\xB8\x7E\xF2\x3B\x2D\x41\x71\x8F\x35\x84\x2C\x5A\x0D\xD9\x85\x43\x78\x3D\x7D\x6C\xF2\x69\x23\xAC\x4E\x64\x16\x8A\xAD\x39\x10\x00\xF1\x89\x8C\x32\x95\x64\x14\x57\x15\x04\x81\xC7\x19\xD0\x87\xD7\x04\xC2\x24\x8B\x00\xCA\x61\x7F\x01\x1D\xC2\x67\x09\x03\x08\x01\xD2\x71\x09\x8B\xD6\x88\x43\x0F\x19\x28\xB7\x0A\x3B\xA0\x83\xAA\x25\x83\x89\x71\x23\x0F\x8A\x9A\x59\x10\xB8\x3B\x1E\x2F\x49\x07\x42\x89\x05\x71\x38\x1C\xBC\x35\x6D\x0B\x3D\x57\x1F\xC4\x43\x11\x0C\x6A\x32\x10\x01\xA4\x72\x1F\x8A\x28\x14\xBF\x1E\x2A\x50\x88\x1C\x0C\x42\x88\x5F\x26\x0B\x8B\x9C\x2F\x30\x14\xCA\xC3\x2F\x24\x00\xA2\x86\x43\x8B\x54\x24\x0E\x8A\x3F\x09\x91\x2B\x3B\x28\x89\x0E\x10\x7B\x05\x43\x8A\x2C\x6A\x2B\x7B\x9A\x48\x1B\x65\x43\x28\x8A\x06\x05\xA2\x8B\x7B\x27\x88\x89\x1E\x45\x24\x8A\x1C\x0B\xB3\x28\xBB\x16\x03\x59\x88\xAF\x27\x89\x88\xE3\x0B\x28\x8A\x17\xB1\x3C\x28\xB0\x3D\x0C\xA2\x82\x16\x68\x93\x79\x7B\x7A\x0C\x8A\xBF\x0E\x0F\xC9\x02\x02\x8D\xA1\x86\xB3\x7B\x25\x04\x18\x8A\x19\x8A\x8E\x2B\x2F\x12\x2E\x51\x97\x94\x77\x43\x8A\x66\x38\x1A\x8B\x48\x36\x20\xB1\x24\x27\xB1\x46\x80\x88\x76\x10\x04\x10\x00\x01\x8B\xED\x58\x64\x14\x94\x96\x2D\x82\x56\xDF\x25\x1E\x88\x42\x88\x54\x79\xB8\x36\x9B\x13\xF9\x14\xB0\x39\x9A\x7E\x84\x07\x89\xB6\x83\xE5\x86\x6E\x81\x94\xF8\x41\x1A\x9C\x66\x7F\x2C\x84\x90\x80\x87\x34\x97\x05\x48\x8A\xFC\x0D\xBC\xFB\x64\x40\x94\x34\x84\xC5\x79\xB3\x81\xBD\x81\x31\x89\x1A\x12\x9C\x1F\xAC\x22\x9A\x17\x81\xC8\x3E\x7D\x5F\x4A\x57\x49\x89\xB9\x69\x20\x29\x98\x3C\x92\x34\x83\x4A\x8C\xD8\x82\x09\x89\x50\x82\x46\xF6\x53\x71\x4F\x0C\x89\x7D\x81\xC9\x7D\xAB\x86\x7A\x71\xA4\x7D\xE6\x65\x32\x29\x81\x3C\x93\x4A\x85\x4B\x8D\x2A\x87\x2D\x8B\x53\x7E\x65\x01\xC4\x24\xA6\x0C\x99\x44\x7A\x32\x83\x13\x74\xC4\x39\x4F\x8A\x92\x0A\xA5\xAB\x79\x42\x95\x4F\x88\x68\x5F\xB0\x86\x27\x88\xC1\x15\xD1\x14\xBD\x11\xA7\x37\x85\x98\x8D\x5C\x81\x18\x87\x16\x86\x2E\x89\x3F\x0F\x47\x26\x94\xE3\x19\xA6\x83\xD9\x84\x15\x76\xD8\x80\xE7\x88\x92\xF8\x28\x24\xBD\x36\x98\x48\x81\x63\x84\xD3\x7A\x19\x49\xA9\x89\xD8\x14\xB8\x1B\x93\x2A\x89\x84\x8F\xFA\x86\x60\x8B\x3E\x7C\x24\x83\x7C\x8F\x4A\x0C\x9F\x3C\x94\x93\x81\xBA\x70\x0F\x89\x65\x80\xF7\x5E\xE2\x14\xAB\x85\x24\x53\x91\x6E\x84\xD9\x80\x02\x88\x7B\x77\x40\x89\xF0\x0F\xF6\x24\x99\x37\x89\xA1\x89\x7A\x32\x98\x88\xBC\x85\x79\x89\xCB\x12\xF5\x25\xAF\x42\x8D\x47\x70\x27\x89\xD0\x77\xF3\x74\x40\x88\x92\x01\xFD\x29\x83\x4A\x82\x34\x86\xFD\x84\xA1", "\x89\x30\x8B\x81\x8A\x85\x0E\x98\x26\xA3\x4B\x9A\xCA\x61\x01\x6A\xAA\x7F\x45\x8B\x52\x75\x3A\x02\x9C\x0D\xA8\x42\x81\x95\x81\x30\x89\x21\x02\x43\x8A\x0A\x83\xAF\x12\xA2\x1A\xB1\x4A\x95\x1C\x81\x25\x8B\x13\x0B\x04\x88\x3D\x88\xF1\x14\xC2\x15\x94\x23\x80\x85\x85\x22\x8D\x0E\x89\x12\x45\xCD\x84\x7A\x89\x50\x29\xB2\x53\x92\xA6\x84\x4F\x8F\xFE\x86\xD6\x6C\x5E\x89\x9E\x14\xB9\x2A\x94\x16\x95\x36\x8C\x53\x8B\x46\x8A\x4F\x8B\x1F\x82\xBC\x10\xBE\x13\x9A\x10\x8B\x81\x84\x23\x80\x00\x03\x4B\x8A\xCE\x83\x31\x15\xEC\x1A\xB3\x54\x8A\x8F\x4E\x2C\x8D\x81\x36\x50\x8A\x9D\x8A\xB9\x0D\xC5\x2A\x86\x54\x8B\x3C\x82\xA3\x70\x5B\x8B\xCE\x3D\xAF\x8A\x4B\x15\xC3\x15\xA2\x55\x93\x99\x86\xE7\x6C\x8A\x80\x7E\x85\x73\x89\x4A\x15\x95\x13\x95\x16\x8D\xAA\x88\x05\x8A\x14\x8A\x16\x88\xFF\x7E\x68\x04\xD6\xF6\x5F\x54\x83\xAA\x8A\x4D\x8D\x42\x89\xB0\x89\x77\x84\x07\x13\xAB\x1D\xB0\x4B\x99\x29\x48\x56\x8A\xAE\x88\x53\x8B\x39\x88\x3F\x10\xB4\x24\x80\x05\x81\xCA\x7B\x29\x45\xB0\x88\x4E\x86\xCB\x84\x88\x15\xA1\x21\x8A\x56\x9A\x2D\x8F\x1F\x86\x0C\x8B\xCE\x89\xBD\x8A\x60\x15\xF3\x29\xB4\x55\x8A\x83\x83\x59\x88\xAA\x8B\xBC\x86\x72\x6F\x6F\x10\x8A\x26\x90\xEC\x6D\xA8\x80\x52\x8A\xC9\x7E\xCF\x88\x6A\x8A\x7C\xB9\x05\x04\xB3\x3C\x75\x77\x89\x45\x8C\xB4\x88\x5F\x8B\x72\x8A\x4E\x02\xC9\xDA\x56\xFE\x7A\x59\x85\xF3\x81\xE1\x84\xF2\x77\xEB\x71\x84\x10\x97\xBE\x6F\x53\x8E\xAD\x89\x59\x8C\xA8\x8B\x66\x8A\x45\x88\x4F\x15\xDE\x09\xBF\x29\x9C\x98\x84\x22\x80\x03\x7F\x3E\x83\x85\x87\xDF\xC6\x28\x04\x9E\x54\x91\xA5\x85\x5A\x8D\x39\x87\x69\x8A\x5D\x89\x14\xF8\x24\x21\xBB\x53\x9A\x84\x8B\xEA\x7E\xF6\x85\xFD\x70\x9D\x89\x47\x0F\x70\x29\xAE\x54\x8D\xAE\x83\x9F\x87\xB9\x89\xBF\x89\x4B\x88\x4D\x0F\xEC\x0F\xB0\x37\x8A\x40\x84\x34\x8C\x50\x86\xD4\x87\xD6\x8A\x98\x15\xE9\x2A\xBB\x54\x91\xAC\x8D\x53\x8B\xCE\x87\x96\x75\xA0\x89\x4E\x13\xC5\x0A\x90\x4D\x82\xF7\x75\x31\x7E\xB1\x88\xA5\x86\xC8\x8A\x0F\x07\x95\x29\x9C\x3F\x96\x83\x86\x2D\x8D\x16\x6F\xD6\x88\x44\x48\xEC\xF3\x49\xE0\x40\x3E\x9F\x9A\x82\xF8\x83\x90\x8A\x23\x09\x6C\x0B\x03\x01\x71\x21\x82\x52\x8E\x59\x82\x81\x3F\x10\x00\xEA\x88\xB4\x82\xED\x58\x11\xCD\x59\xE1\x22\x9C\x30\xB5\x6F\x06\x03\xF6\x88\x08\x42\xAC\x66\x09\x01\x11\x9A\x78\x04\x0C\xE0\x5C\xC3\x88\x7A\x3B\xF5\x89\xBF\x87\x3C\x05\x86\x02\x1E\x9D\x8A\x45\x72\x7F\x8B\x2F\x4A\xE1\x89\x09\x01\x0E\x2C\x9F\xC1\x65\x9E\x83\x3D\x8A\xB5\x4C\xFD\x89\x17\x03\x7B\x02\xC5\xB3\x0C\x4F\x93\x4C\x12\x61\x8F\x7B\x89\x14\x5B\xF8\x89\x2D\x16\xDA\x3C\x6F\x58\x8A\xAF\x16\xF4\x27\x25\x05\x85\x8B\x0B\x8B\x66\x83\x19\x2C\x9B\x58\x96\xB1\x88\x26\x87\xCC\x02\xFC\x88\x03\x28\x3B\x16\xB1\x2C\x9A\x40\x2F\x49\x0E\x61\x8C\xCB\x38\x88\x8A\x64\x44\x22\x16\xEE\x27\xA4\x64\x58\xB1\x8A\x4E\x89\xA4\x41\x92\x8B\x31\x81\xAA\x9D\x01\x16\x15\x6C\x66\xB1\x86\x50\x4E\x24\x8B\x30\x71\x93\x00\x01\xD2\x7A\x7B\x56\xC4\x6B\x04\x0E\x1B\x8F\xFF\x6F\xC9\x05\xFA\x31\xF5\xDF\x77\xE9\x67\x6A\x25\x41\x03\x63\x8A\xED\x21\xA4\x73\x4A\x00\xAE\x00\x98\x04\x96\x3A\x08\xB3\x82\x00\x72\xCD\x8A\xDC\x27\x97\x04\x70\x16\xAA\xEA\x72\x3D\x32\xA0\x3D\x83\x04\x72\x38\x58\x82\x04\x8A\xC2\x44\x2C\xCD\x0C\x02\x11\x34\x76\x40\x8D\x1C\x80\xEF\x82\x09\x04\x74\x16\x8E\x9F\x49\x82\x77\xB3\x89\x64\x21\x9D\x79\x1A\x23\x3D\x8B\x28\x00\xA9\x1A\x14\xD0\x20\x42\x8B\xC3\x7D\x77\x33\x82\x8B\x9A\x85\x30\xAB\x19\x86\x63\x0A\x99\x36\x58\xB3\x00\x83\x7D\xA9\x20\x2F\x49\x9C\x64\x7F\x17\x80\xF8\x20\x89\x50\xB0\x80\x6F\x3C\x78\x4C\x36\x8A\x06\x77\x0D\xE9\x67\x04\x1C\x03\x8C\x47\x88\x95\x7B\x3C\x78\x4A\x7A\x87\x14\xDD\xCD\x0C\xD2\x63\x11\x03\xF3\x78\x8F\x89\xB4\x20\x63\x88\x10\x66\x0D\x01\x1B\x5A\x96\xD9\x7A\x7A\x02\x5C\x23\xA7\x8A\x7F\x5F\xA1\x16\xC9\x02\x98\x48\x23\x11\x09\x3A\x8E\x93\x78\x77\x88\xFF\x88\x55\x14\xA9\x2D\xA4\xD2\x6B\xB5\x89\x00\x83\x10\x82\x7C\x89\xE6\x67\xC9\x16\xF8\xEE\x2A\x5A\x83\x13\x4D\x6C\x8C\x64\x84\x40\x58\x4C\x4D\x27\x01\x19\x16\xA5\x33\x91\xB6\x8A\x85\x38\x96\x7B\x58\x7B\x30\x8A\x8E\x2B\x5C\xE7\x58\x2C\x11\xB5\x86\x10\x04\xDB\x89\xA8\x3A\x6F\x8B\xE4\xD8\x5F\xC3\x0D\x81\x72\xDD\x15\x66\x8D\x0A\x86\xB3\x0F\x43\x32\x9B\x51\x70\x50\x4C\x52\x8A\x3A\x7F\x08\x01\xD2\x71\x1E\x01\x38\x8B\xAD\xDF\x6F\x2D\xA8\x3A\x28\x24\x3F\xCF\x87\x1E\x28\xF5\x02\x44", "\x8A\x0F\xE8\x4A\xA1\x38\xAD\x3B\x88\x03\x0E\x2A\xD6\x24\x17\x8B\xC5\x26\xEA\xE0\x06\x0B\xA3\x0B\x9E\x28\x3A\x5D\x8E\x20\x02\x82\x8A\xF2\x86\xED\x03\x8D\x26\xAF\x3B\x9C\xA6\x83\xA2\x1A\x4C\x8B\x45\x84\x94\x86\x9B\x14\x95\x11\x9D\x52\x99\x43\x42\xA4\x37\xE1\x8B\xA8\x87\xC8\x7E\xBF\x12\xED\x11\xBF\x55\x96\xC4\x58\x21\x8D\x75\x81\x2A\x8B\xCE\x82\x2B\x12\xF7\xF8\x47\x35\x95\xB1\x7C\x70\x89\xF5\x32\xC7\x8A\x3B\x83\x20\x17\xD1\x25\x80\x4B\x8F\x98\x82\x2C\x8A\x4B\x8B\xCF\x47\xAC\x80\x81\xE8\x5C\x1A\x93\x17\x9F\x7D\x65\x53\x35\xE1\x89\x82\x8A\x58\x82\x58\xD8\x03\x26\xB2\x48\x95\xAB\x8D\x59\x88\x1B\x84\x5C\x86\x6D\x84\x72\x0D\xB5\x1F\x92\x8F\x5F\x46\x83\xF4\x01\xA0\x8A\x40\x01\x97\x8B\x74\x0F\xB1\x2E\xA9\x4B\x92\x96\x8B\x2E\x88\x6B\x8A\x80\x82\x29\x89\xF2\x08\xA4\x05\x9D\x5C\x80\xBA\x83\xF4\x70\xBF\x88\xE5\x87\xC4\x8A\xC1\x15\xC6\x1F\xB8\x05\x9B\xB8\x89\x36\x6B\xEB\x88\xBB\x87\x58\x82\x32\x17\xA2\x2E\xB4\x5C\x82\x35\x65\x72\x8E\xD5\x79\xE3\x86\x49\x5F\x66\x12\xE3\x9F\x68\x49\x9B\x1E\x70\x65\x04\x4B\x04\xD4\x8A\xA3\x87\x00\x08\xA5\x25\x94\x29\x9B\xAA\x85\xD8\x82\xA0\x7C\x3E\x8A\xCE\x75\xC0\x0D\xB3\x03\x82\x37\x84\x54\x84\xDC\x83\xE7\x06\xCF\x8B\xA7\x8B\x5C\x17\xD9\x15\xB5\xDB\x66\xA7\x89\x05\x88\x5C\x61\x99\x83\x84\x8A\xFE\x14\x9A\x07\x86\x42\x9B\x08\x8C\x9C\x37\xEE\x88\xD7\x86\x29\x85\x7A\x17\xF7\x1E\xA0\x3D\x9F\x93\x87\x64\x85\xA2\x8A\xFE\x87\x93\x8A\x2B\xF0\x11\x0F\x8F\x4A\x9E\x4A\x8F\x6D\x62\x52\x89\x19\x70\xBB\x8B\x89\x17\xF2\x13\xA1\x1D\x9C\x97\x8A\x28\x8A\x53\x8A\x80\x86\x6D\x01\x04\x0E\xD3\x2B\x87\xF4\x75\x93\x81\x79\x8A\xC1\x87\xA7\x82\xBD\x8A\xB9\x69\x16\x2F\x8A\x39\x8A\x6B\x89\x55\x8B\xB0\x84\xDF\x8B\xDB\x83\xA9\x12\xB2\x0D\xB9\xBA\x75\x98\x89\x7B\x89\xF5\x89\x5B\x84\xD3\x8A\x4A\x13\xA8\x2B\x99\x40\x80\xAA\x82\x32\x8E\xBC\x32\xEE\x8B\x77\x85\x30\x15\xCA\x25\x87\x41\x8C\x96\x89\x04\x8A\x05\x68\x52\x8A\x8E\x8B\x71\x6D\x4F\x2F\x8C\x1F\x91\xBE\x80\x51\x8B\xFA\x8A\x44\x8A\x1B\x88\xF8\xCD\x1F\x2B\xBA\xA8\x5F\x4D\x8E\x6D\x5F\xAC\x8B\x49\x00\xED\x8B\xD5\x02\xC3\x29\xA7\x26\x86\x99\x8D\xAA\x80\x06\x88\x70\x7E\x81\x6A\x21\x65\x07\x2F\x81\x04\x08\xBF\x81\x95\x82\xFD\x8B\xAA\x84\xF6\x8B\x56\x0D\xA8\x26\x8F\x41\x77\x83\x8B\x51\x8E\xA3\x68\x30\x61\xD1\x8A\xCE\x17\xC6\x2F\x84\x3A\x88\xBE\x82\x52\x8B\x69\x88\xB9\x88\xA3\x6D\x43\x10\xC0\x29\x85\x5F\x87\xBB\x81\x74\x8A\xE2\x8B\x8F\x89\x91\x8B\xA5\x0F\xB7\xEF\x7E\x1C\x86\x97\x8F\x51\x32\xFE\x88\x00\x00\xFA\x8B\xA5\x09\xF6\x2F\x94\x35\x98\xBF\x8F\xDF\x82\xFF\x8B\x2C\x6C\xFE\x8B\x46\xE4\x03\x2B\xB7\x42\x81\xC0\x8C\x80\x8D\xEB\x8B\x5C\x8A\xF6\x8A\x4E\x15\xEE\x2B\x8B\x56\x88\xF1\x71\xB8\x7C\x04\x8F\x60\x84\xC3\x83\x42\x17\x89\x25\xBE\xE4\x7A\x14\x60\x30\x8B\xB9\x8A\xD9\x8B\x17\x8C\xEB\x08\xA1\x2E\xA9\x24\x90\xC0\x81\x24\x89\xD5\x86\xBB\x88\x15\x72\x50\xFE\x52\x26\xAE\x5C\x82\xC0\x8F\x93\x81\xA4\x8A\xCC\x89\x91\x8A\x04\x02\xD0\x04\xBE\x13\x8C\xAD\x85\x30\x68\xF5\x89\x09\x8C\xC5\x8B\x95\x10\xCA\x2F\x89\x0D\x7B\x98\x83\x27\x8A\x02\x06\xC7\x89\xE4\x77\x20\x13\xE6\x20\x75\x5D\x87\xBF\x84\x84\x88\x37\x86\x11\x8C\xE9\x86\x6C\x15\xB2\x2B\xA9\x2C\x90\x89\x55\x24\x87\xFE\x58\xCB\x88\xA9\x62\xD7\x0D\xBA\xD7\x7F\x13\x9C\x7F\x6B\x85\x8E\xC4\x5D\x17\x8C\xE8\x86\x5F\x18\x85\x2A\xA1\x61\x8D\x11\x84\xF3\x86\x11\x8A\xCD\x86\xBA\x7C\x34\xF8\x6B\x14\xBA\x3C\x8E\xEF\x5D\x86\x8E\xE1\x8B\x1B\x8C\xC9\x86\x04\x15\x8C\x2F\xB6\x55\x99\x6F\x3D\x34\x8A\xF0\x89\xD5\x4D\xF2\x8A\xB9\x15\xD2\xDA\x74\x5D\x83\xC2\x8F\x84\x8A\xF5\x8A\xB6\x84\xD6\x8B\x86\xF9\x70\x2B\xA7\x06\x8F\x9A\x8D\xBE\x76\x16\x8B\x4E\x76\x27\x8C\x38\x18\xA7\x12\xBA\x60\x9B\xA6\x8C\x83\x8E\x9E\x89\xD6\x89\x4E\x61\x75\x18\xFE\x15\x94\x5A\x99\xCC\x76\xC7\x69\x15\x81\xDF\x87\x33\x72\x9A\xC2\x50\xEB\x29\x4F\x97\xB4\x8D\xEC\x80\x08\x0A\x24\x01\x07\x8B\xAC\x66\x13\x01\x11\x9A\x60\xB8\x32\x38\x3D\x21\x6C\x0E\x00\x20\x8B\x54\x76\x2C\xCD\x14\x02\x11\x34\x7F\x09\x04\xC1\x5D\x2F\x8D\xD3\x3A\x4F\x16\x85\x27\x7C\x0A\x91\x04\x04\x62\x8E\x41\x70\x97\x8B\xF6\x49\x28\x16\xC9\x9A\x57\x50\x81\xB0\x87\x36\x8C\x81\x48\xE8\x89\x52\x34\x03\x04\x19\xA2\x2D\x59\x81\x08\x02\x8B\x8D\x8F\x70\x91\x8A\xEF\x73\xD2\x13\xD5\x2C\xA2\x07\x4F\xC6\x80\x89\x31\x1A\x8C\x0F\x29\x42\x72\xE4\x75\x38", "\x31\x9F\xD5\x3A\xC5\x8C\x8B\x8F\x1A\x8D\xE7\x88\x6D\x8C\x2C\x50\x5C\x31\xB9\xC1\x3E\xC6\x8C\x39\x37\x25\x07\x2F\x8C\x2C\x3B\xC1\x18\xC9\x27\x43\x63\x92\xB2\x87\x40\x89\x8A\x4E\xDC\x89\x6F\x4A\xEA\x18\x87\x1D\x2C\x63\x86\xD2\x41\xB0\x07\x7D\x6F\x31\x8D\x8C\x28\x16\x11\xAA\x06\x9C\xEF\x69\x3D\x31\x66\x89\x7A\x88\xA0\x8B\x24\x27\xAC\x18\x91\xC2\x49\xC4\x69\x08\x09\x67\x8B\x7B\x7B\x74\x4B\xFF\x89\x36\xFF\x12\xF0\x16\x02\x07\x2B\x8C\x6A\x34\x23\x78\xCD\x52\xED\x6F\x82\x73\x74\x17\xBF\x11\x40\x14\x0C\xFE\x7B\x94\x85\x16\x87\x32\x86\x09\x19\x81\x28\x84\x3D\x00\x38\x07\x6F\x8B\xAA\x78\x76\x4A\xD3\x1B\x00\x14\xFC\x23\xBC\x3C\x15\x68\x80\x05\x84\x4B\x07\x2A\x8D\xC9\x84\x93\x05\x86\x2B\xAA\x55\x9F\xAD\x85\x4F\x8C\x45\x1E\xC5\x8A\xA0\x86\x64\x12\xA8\x2E\xBE\x04\x8B\xE6\x67\x57\x88\xC3\x78\x88\x89\x44\x80\xB9\x69\x2F\x32\xB6\x34\x94\x4C\x8F\x58\x8F\x04\x8D\x7E\x8A\xB0\x8B\x96\x14\xBD\x1A\xA9\x53\x87\xA5\x87\x71\x8A\x93\x89\x8C\x7B\x1A\x89\x70\x80\x20\x1F\x82\x94\x62\x52\x32\x94\x8A\xD2\x84\x51\x8D\xFB\x8A\x46\x19\xDF\x2E\x92\x56\x81\xBB\x86\xD4\x81\x97\x8A\x3D\x02\xAD\x80\xE4\x04\x83\xD1\x7A\x48\x87\x46\x85\x5F\x8F\x24\x01\x55\x8C\x96\x87\x93\x0E\xAE\x1E\x9E\x5D\x9C\x7D\x88\x94\x8B\xBF\x88\x65\x8A\x54\x7E\x25\x03\xAA\xF9\x51\xF2\x6C\xBA\x82\x44\x89\xF5\x33\x59\x8C\x01\x85\xAC\x05\x92\x29\xAF\x3C\x85\xA6\x81\xF3\x83\xC3\x86\xD8\x5E\x6B\x8A\x94\x90\x76\x32\xB9\x22\x97\x6D\x8D\x5B\x8D\xAF\x89\x9B\x88\x8A\x8B\xC0\x08\xB6\x2E\xA3\xB3\x40\xA7\x86\x0E\x86\xBC\x33\x5D\x8D\x6C\x87\xA1\x08\xA1\x29\xA3\x22\x8B\x7F\x8C\xA7\x86\x14\x85\x45\x84\xA6\x8C\x38\x19\xA7\x2E\xAC\xF3\x65\x42\x5E\xCE\x7A\xEE\x88\x48\x66\x33\x48\xB8\x06\x2E\x32\x83\x66\x94\xC8\x6F\x5A\x89\x10\x8D\x6C\x8A\xF5\x86\xC1\xFE\x30\xED\x4E\xB9\x72\x93\x82\x7B\x8B\xBC\x8B\x81\x86\x48\x89\xDF\xC6\x05\x2F\xAD\x64\x86\xCB\x83\x9A\x88\xB9\x82\x26\x8D\xB4\x8B\x3B\x18\xEB\x2E\xAB\x24\x86\x7D\x88\x50\x8E\xBA\x84\x5D\x86\x7F\x82\x0B\x15\xD6\xDA\x7B\xA7\x2F\xCC\x86\xF1\x87\xC4\x83\x2C\x8A\x1B\x84\x1C\x18\x9A\x1C\x9E\x60\x96\x34\x8F\x77\x8F\x1D\x7C\xE8\x8B\xBE\x7C\xA2\x17\xAF\x33\xA4\x5E\x9D\x6B\x60\x9A\x8A\x30\x8E\x6D\x86\xD2\x8C\x85\x19\xB0\x2B\x87\x26\x83\x02\x65\x52\x8B\xDF\x79\xA7\x88\x43\x8C\x0A\x10\xA0\x25\x8C\x40\x96\xC1\x81\xD7\x34\x38\x8F\xBF\x86\x0B\x87\x1A\x18\x98\x1C\x89\x67\x82\x73\x8B\x9C\x8F\x2F\x8E\xF0\x8A\x85\x7C\x15\x18\xD6\x33\x80\x2B\x91\x54\x85\x9A\x89\x0E\x8E\x20\x8D\xA2\x8B\x0D\x7F\x4C\x2F\xBA\x3C\x16\xC0\x86\x9E\x8B\xF9\x81\xFA\x8B\x87\x8A\x25\x13\x91\x2A\xA7\x4C\x93\xA8\x8F\x52\x47\xFA\x8B\xC2\x22\xAA\x8C\xB5\x19\x91\x1B\xB8\xA5\x6B\xBC\x87\x9A\x8C\xAC\x8B\xAA\x87\x62\x89\xC0\x09\xBB\xCF\x32\x67\x92\x36\x81\xAC\x82\xBD\x89\x58\x8A\x9A\x8C\x65\xD4\x5D\x2A\x9A\xBB\x22\xCD\x87\x9D\x8E\x36\x8F\xAD\x86\x07\x8C\x04\x13\x9D\x31\x9D\x53\x91\x98\x8F\x83\x8C\x3C\x86\xE6\x62\x99\x6D\xF1\x17\x93\x34\xB0\x64\x93\x36\x86\xA1\x8A\xB3\x88\x0A\x8C\xA2\x8B\x5C\x19\xDA\xD1\x48\x60\x85\x0F\x81\x9F\x8E\x31\x8D\x82\x8D\xE7\x86\x80\x18\xF6\x33\x8D\x68\x92\xC0\x8E\xA8\x5E\x6A\x72\xBD\x78\x1B\x8D\x1D\x1A\x8A\x34\xB1\x4C\x80\xC3\x88\x84\x8F\x49\x82\x14\x88\xF8\x80\xDA\xCA\x2D\x1D\xAD\x5C\x80\xD2\x83\x9F\x8C\x30\x8D\x8B\x8C\xDF\x8A\x2F\x1A\x9C\x2B\xB1\x68\x87\x5C\x72\xF7\x74\x05\x8C\x7A\x8B\xA0\x8C\x37\x1A\x83\x1D\x85\x61\x84\xC0\x87\x84\x8E\x00\x8E\x65\x87\xED\x79\x35\x18\xC0\x32\x88\x68\x81\xD2\x88\xA3\x8B\x41\x8D\x14\x8C\xE8\x8A\xA9\x15\xCA\x30\x94\x0A\x61\xAD\x83\xEE\x80\x90\x78\x87\x8D\x26\x8D\xD8\x19\xCF\x34\x86\x66\x8E\x98\x85\x75\x8D\xE6\x8B\x27\x8D\xF5\x7B\x14\x13\x81\xB4\x6F\x69\x94\xD0\x84\x9F\x89\x3B\x8E\x69\x8D\xED\x8C\x53\x18\x95\xF0\x6D\x66\x96\x74\x07\x85\x88\xB7\x89\x58\x8C\x30\x75\x1C\xC5\x21\x33\xB4\x66\x84\xD3\x8A\xA5\x8E\x0B\x8C\x97\x8C\x22\x8D\x5E\x1A\xB4\x26\x82\x6A\x98\xA8\x85\x7D\x80\x12\x8B\xF5\x83\x44\x8C\xD9\x07\x89\x35\xAA\x68\x83\xCA\x81\x93\x8D\x28\x8F\x61\x8B\xA3\x8C\x5B\x19\xAA\x30\xB8\xF9\x63\x2A\x86\x7A\x6F\x66\x8B\xAC\x84\x19\x81\xD5\x19\xCC\x34\xBC\x69\x8E\xD2\x82\x93\x8B\xBD\x88\xA8\x8D\xF6\x8A\x6E\x19\x9A\x3E\x52\x57\x94\xD4\x8F\xB9\x77\x14\x8A\x9D\x89\xF3\x8A\x91\xD6\x7B\x34\xAB\x68\x95\xD0\x8D\xAA\x8F\x42\x8D\x94\x8C\xE0\x8A\xA2\x1A\xB2\x35\x92\x62\x80", "\x54\x84\x89\x8D\xFF\x76\x25\x8D\x67\x57\xBA\x1A\x9C\x35\xAC\x68\x9D\xD5\x8E\xA2\x8F\x55\x8D\x0A\x8D\x58\x8D\x97\x93\x51\x2A\x94\x1F\x58\x57\x8F\x0B\x8F\x07\x87\xB6\x74\xC0\x6C\x5E\x13\xFD\x15\xA4\x15\x8B\x43\x8B\x09\x0B\x75\x3D\x93\x8B\x90\x8C\xD6\x0C\xC0\x20\x1A\x02\x10\xC5\x80\xF7\x03\x13\x01\xA4\x73\x46\x34\x82\x73\x21\x64\x7A\x46\x3B\x35\x79\x26\x2C\xD5\x30\x27\x01\x73\x8D\x0C\xBE\x6A\x35\xBE\x6C\x5C\x39\x71\x9C\x2A\xBF\x2A\x90\x4C\x5E\x81\x99\x00\x45\x31\xAE\xDB\x7F\xC7\x8E\xB3\x49\x19\x8F\x40\x01\x71\x8D\x2B\x16\x87\x27\x87\x59\x95\x89\x2D\xE7\x5B\x21\x04\x91\x29\x77\x02\x15\x01\x3A\xA3\x13\x63\x80\x00\x06\xAE\x8C\xA3\x39\x23\x35\xF7\x89\x3F\x7D\x77\x31\xAC\x54\x45\xD8\x85\x9A\x07\x60\x8E\x53\x28\xDD\x28\x9A\x0F\x42\xED\x2C\x6B\x8F\xBB\x3E\xAE\x88\x5E\x8D\x10\x8B\xC1\x76\xAE\x9B\x4D\x31\x89\x4F\x54\xD8\x81\xD4\x06\x62\x8D\xC2\x8C\x9F\x4D\x19\x1B\xA3\xEB\x34\x6B\x88\x08\x36\xAF\x8C\x2E\x4C\xBE\x8C\x7A\x8C\x06\x19\xF6\x31\xBD\x4D\x84\xD8\x8E\xFA\x66\x60\x8E\x0C\x03\xB2\x28\x08\x1B\xF9\x15\x75\xA6\x41\x58\x03\xDB\x6C\x5F\x8C\xDA\x4C\x70\x8D\xCE\x0C\xF4\x5F\x43\x50\x81\x81\x63\xC7\x32\x7F\x32\x02\x8A\x58\x2D\x38\x60\x59\xCF\x51\x64\x98\x45\x34\x06\x25\x6C\x89\x60\x8D\xE2\x22\x72\x14\xFB\x01\x98\x3A\x33\x2E\x52\xBE\x07\xB5\x26\xBD\x06\x5B\x8B\xDB\x4F\x0B\x36\xA0\x5D\x22\x8B\x6B\xB5\x8A\x14\x50\x01\x67\x38\x8A\x96\x64\x73\x28\x85\xE4\x14\xDA\x8B\xA6\x06\x6A\x8E\x52\x01\xEF\x30\x2F\x09\x5D\x36\xA4\x28\x96\x3D\x1B\xE9\x26\x8C\x88\xD3\x0F\x3F\x8A\xF7\x7F\x00\x05\x2C\x9A\x2A\xDB\x8C\x32\x7A\x20\x00\xB7\x8B\xF7\x89\x5A\x14\x96\x03\x07\x5C\x81\x5E\x14\xB6\x8A\x30\x0A\xD9\x8D\xE7\x02\xE0\x16\xC1\x57\x34\x50\x89\xA4\x8B\xD8\x26\x6D\x8D\xE9\x20\xB8\x8D\xA3\x16\xC4\x2D\xB1\x83\x6B\xC9\x89\x8C\x7A\x51\x8D\x77\x4A\x5A\x87\x71\xD9\x19\x31\x9F\x68\x9B\xC4\x8E\x57\x8A\x37\x8F\x85\x89\xCB\x8C\x99\x0F\xCF\x1F\xAA\x36\x97\x57\x78\x59\x02\x8B\x7E\x87\x88\x2E\x7E\x64\x17\x8C\x01\x9D\x43\x70\xDC\x81\xD2\x6D\x11\x8F\xF1\x8A\xE7\x8A\xC9\x17\x90\xBE\x77\x64\x89\x91\x8A\x1C\x72\x0D\x76\x8C\x7B\x8A\x75\x2C\x17\x8E\xE4\x63\x6E\x8A\x77\x85\xEB\x82\x72\x8D\xBB\x86\x10\x8D\x43\x17\xD2\x34\x81\x6B\x86\xBA\x89\xD5\x80\x10\x77\x79\x71\x88\x81\x63\x19\xBC\x2E\xA6\x95\x53\xDD\x81\x98\x85\x24\x86\xED\x8C\xB4\x8B\x53\x17\xB3\x2E\xB5\x69\x80\xAC\x8A\x98\x8F\x9C\x47\xEC\x87\xA4\x8B\xCC\x14\xD3\xD7\x35\x2E\x58\x02\x74\xBC\x8A\xBC\x87\xFA\x80\x88\x8B\x84\x09\xB8\x37\xB2\x60\x86\x56\x80\xDE\x30\xF8\x86\x46\x73\xDC\x34\xDF\x1A\xA1\x1D\xA1\x17\x9F\xB8\x83\x5E\x84\x72\x8F\x61\x8C\x11\x8D\x8A\x07\xDE\x29\xB3\xD8\x6C\xCC\x83\x83\x6D\x7A\x8E\xF8\x8D\xF1\x86\xE4\x1B\xE5\x1B\xA6\x6F\x94\xD3\x87\x35\x8D\xDF\x5C\xE6\x8C\x24\x74\x9A\x0F\x99\xED\x65\x49\x8D\xA7\x80\x14\x83\xC6\x83\xEE\x44\xF7\x8D\x72\x0F\xA2\x1D\xB0\x5C\x85\xDF\x88\x9B\x8C\x13\x8E\xE5\x8D\x1E\x8C\xBD\x90\x3E\x1B\x85\xF4\x64\xAE\x8D\xFF\x81\x0D\x8C\x5B\x77\x3B\x89\x9A\x1A\xE6\xCB\x21\x6F\x81\xE0\x83\xBE\x8B\x80\x8E\xFC\x8D\x02\x8E\x95\x1B\xCB\x37\xBB\x66\x8A\xDF\x83\xA4\x7A\x50\x8A\x89\x8C\xC9\x8B\xB6\x0A\xF1\x5D\x40\x70\x84\x7A\x81\x7B\x80\xEF\x89\x8A\x87\xCC\x8B\x97\x12\x9B\x2F\xAC\x4B\x9D\xBC\x8D\x67\x85\x51\x8B\x9F\x83\xD4\x80\xB2\x03\xFC\x9F\x40\x1C\x03\xE1\x8A\xF5\x85\x84\x8F\xE5\x8B\xA3\x87\xBD\x17\xBD\x1C\xBF\x5E\x9F\x71\x84\x51\x8C\xD3\x74\xAB\x6C\x47\x89\xD2\x19\xC1\xD2\x63\x67\x82\xD3\x81\xD7\x33\x82\x8C\x09\x8F\x13\x87\x26\x1C\xF5\x1E\x95\x4D\x94\xBA\x85\xBF\x8C\x79\x8C\xCF\x80\x09\x88\x1A\xCA\x5F\xE8\x45\x71\x84\xDD\x89\xE1\x6E\x74\x8F\x00\x8C\xD4\x8D\x05\x18\xD2\x30\xA0\x78\x7A\xCF\x86\x07\x84\x39\x36\x11\x8F\x1A\x8E\x48\x1C\xB7\x38\xB9\x5D\x99\xE1\x89\xF4\x83\x87\x8F\xD2\x86\x20\x87\xC9\x01\xB2\x37\x9B\x4B\x74\xE2\x83\xF0\x71\x2D\x8E\x5E\x8D\xB5\x8C\x94\x14\xED\x32\x98\x3A\x9C\xAF\x82\x31\x8B\xB5\x7F\x94\x86\x63\x89\x20\x65\x16\x30\x9F\x71\x98\x71\x8E\x90\x82\x8C\x8F\x09\x8E\x32\x8E\x5F\x0F\xE6\x38\xAA\x8B\x51\x81\x83\xBC\x8B\x8D\x8C\xED\x8D\xC8\x8D\xD8\x1B\xB0\x30\x9A\x6F\x90\xC4\x8C\xBD\x8C\x0D\x8A\xF8\x8B\xAF\x84\xE6\x09\xDF\x37\x82\xA9\x3B\xE3\x88\xE4\x80\xAD\x87\xEE\x8B\xC0\x86\x80\x1C\xA6\x25\x94\x5F\x82\x83\x83\x1E\x87\x3E\x85\x11\x6C\xEA\x8D\x86\x1C\xC5\x37\x84\x1E\x87\xDE\x8D\x80\x8B", "\x7E\x8F\xC4\x8A\xF4\x8D\x89\x19\xA9\x0E\x93\x60\x8A\x0F\x81\x7F\x6C\x86\x8C\x1F\x8E\x28\x85\x7E\x1C\xCA\x38\xA8\x70\x96\x9A\x8A\xC2\x8E\xEA\x88\x94\x87\x12\x8D\x10\xF0\x22\x30\xA8\x94\x72\xE0\x8C\xC6\x8F\x5A\x87\x2E\x84\x33\x8D\xD3\x14\xE8\x34\x9D\x4B\x98\x97\x82\xC5\x8B\x3F\x34\x25\x8E\xD0\x86\x9A\x07\xD0\x2F\x98\x55\x92\xBE\x80\x06\x8B\x93\x8C\xAA\x89\x31\x88\x78\x07\x96\x2B\x81\x04\x8E\xE5\x85\xC9\x8F\xAF\x87\x25\x8F\x1D\x87\x99\x1C\xFB\x2E\x8E\x73\x92\x95\x81\x7E\x88\x04\x8F\x12\x7D\x20\x8C\xA4\x00\xD4\x39\x88\x73\x96\x50\x8A\xCC\x88\x43\x84\x33\x8F\x56\x88\xDF\x17\xD5\x2F\xBB\x5F\x9D\xAF\x8B\x87\x7E\x99\x83\x4E\x40\x71\x8E\x11\x06\xA1\x1B\xA5\x73\x83\x6D\x87\xCE\x88\x56\x8B\x36\x8E\x9A\x8A\x20\x08\xFF\x9E\x64\x61\x8A\x29\x86\x5B\x8A\x10\x8B\xC7\x88\x4C\x8D\x7E\xFE\x5B\xC7\x73\x70\x81\xE5\x86\xBD\x8A\x30\x85\x22\x8F\x1C\x8C\x18\x1C\xE7\x37\x87\x70\x9E\xC4\x85\x80\x83\x0C\x8D\x59\x7C\x84\x87\x66\x18\xA1\x1E\xAD\x4C\x92\x84\x82\xC3\x89\xF5\x33\x31\x8F\x78\x8E\xC9\x1C\xDB\x2F\x8B\x73\x9D\xBE\x8D\xCC\x89\x9D\x8C\x27\x8E\x31\x7C\xA4\x1A\xB6\x26\xB0\x08\x87\xD5\x84\x51\x86\x0C\x4B\x40\x8F\xC7\x8D\x87\x1C\xA5\x37\xA4\x72\x86\xC1\x8F\xA9\x8A\x2B\x8C\xAC\x8D\x39\x8E\xA3\x1A\xF5\x30\x80\x71\x96\xD5\x85\x7B\x89\x0A\x7D\x08\x8E\x93\x57\xF0\x1C\xCA\x0F\xAE\x2B\x9A\xE8\x86\xCE\x8C\xA3\x8C\x3A\x8F\x01\x8D\xE0\x17\xA0\x3A\xB2\x74\x9E\xCA\x64\x82\x84\xA4\x8C\xDA\x87\xA8\x89\x8D\x0B\xC6\x39\xBD\x72\x90\x4F\x8F\x75\x86\x11\x8C\x83\x8C\x40\x8D\xBC\x09\xD2\x35\xB0\x71\x61\x6C\x7B\xAD\x88\x09\x79\x9B\x6A\xC3\x76\x43\x08\xE1\x26\xB3\xD8\x6C\x22\x0F\x8E\x88\x68\x8D\x45\x78\xE0\x7C\xA0\x00\x34\xC2\x63\x50\x89\x08\x03\x0A\x01\xD2\x70\x24\x44\xC1\x39\x8D\x0E\xDA\xA3\x1B\x6C\x8A\xC5\x3C\x6A\x34\x14\x02\x59\x8F\x1B\x7E\x2F\x09\x69\x3A\xB7\x47\x27\xC6\x80\x28\x2C\xD5\x32\x61\x24\x9A\x53\x3E\x29\x61\xC2\x79\x75\x8B\x97\x44\x6F\x73\x51\x06\xBD\x72\xB1\x4E\xAC\x66\x21\x01\x11\x9A\x68\xFC\x11\x16\x74\xB0\x8C\x5F\x8F\x18\x80\xE7\xD1\x74\x32\x79\xE7\x7C\x79\x0F\x71\x06\xB0\x8E\x57\x8E\x0A\x8A\x6C\x08\xA1\x89\x7B\x5A\x97\x67\x89\x17\x05\xD7\x8A\xEB\x15\x5F\x8B\x29\xD7\x41\x2D\xA8\x22\x83\xB6\x8B\xF8\x35\xD4\x8A\x6D\x53\xDD\x4C\x74\x1B\xE7\x2D\x8B\x5B\x94\xB6\x8F\x0D\x68\xD3\x24\xA6\x8A\xBD\x82\x06\x01\x27\x16\xA0\x76\x93\xB5\x8E\x1D\x8D\x11\x8A\xBA\x8B\x19\x7B\x2C\x19\xFA\x3B\x5C\x29\x1D\xEA\x84\xD3\x87\x57\x87\xAA\x8D\x38\x8D\xCC\x1A\xD0\x34\x8E\x6B\x90\xD1\x89\x94\x8D\xCC\x84\xD9\x81\x81\x8D\x01\x7E\x4E\x32\x8F\x3E\x9F\xDC\x81\x14\x81\x19\x7F\x49\x8E\x83\x00\xB4\x1D\xEB\x1C\xB6\x76\x9B\xD5\x8D\xA7\x8A\x4E\x8E\x76\x8C\x78\x87\xAB\x1B\xEB\x29\x98\x5C\x8F\xCA\x8E\x1C\x73\xC6\x7A\x54\x8C\xCB\x56\xB3\x1D\xB4\x1B\xBE\x86\x6C\xEE\x8C\xAA\x8E\x53\x8F\x4C\x8D\x5F\x8D\x35\x19\xE9\x37\x8D\x6F\x87\xB2\x7E\xBB\x89\xBA\x81\x2F\x8B\x9D\x8B\x13\xDD\x47\x3B\x83\x04\x09\xEE\x8A\xF2\x84\xCD\x84\x5A\x8D\xAB\x8C\x6A\x19\xD9\x32\xAC\x65\x81\xD5\x80\xAD\x8A\xEC\x89\x32\x8B\xB8\x86\x45\x12\xF3\x1A\x96\x57\x99\x66\x39\x24\x8A\x8D\x8D\x42\x00\xF6\x8E\xA8\x06\x91\x1D\xAF\x77\x9D\xD4\x88\x95\x8D\xA5\x8F\x7C\x8F\x97\x8E\xED\x0F\xB1\x0D\x98\x5D\x9D\x31\x59\xDD\x8E\x51\x85\x6D\x86\x38\x8D\x1E\x1A\xB7\x37\xA6\x72\x8F\xC0\x8B\xD0\x8B\x44\x8C\xA0\x89\x2D\x89\xC6\x1D\xA9\xCF\x00\x78\x9E\x44\x87\x50\x80\x2F\x8C\x9E\x84\xC9\x8C\x05\x0A\x94\x33\x97\x3A\x96\xCC\x86\x4A\x89\x73\x8D\x6A\x86\x9E\x80\x42\xDA\x68\x06\x9E\x66\x94\xEB\x66\x06\x4D\x48\x05\x83\x8E\x5F\x85\x8F\x0A\x90\x3C\x82\x69\x89\x9A\x89\xC5\x8A\x98\x8D\xD2\x61\xFC\x87\xE0\x0F\x81\x2F\xBC\x3F\x83\xBC\x80\xD0\x88\x82\x8D\x45\x8E\xF3\x32\x1B\x1E\xCF\x1A\x99\x12\x85\xCE\x80\x69\x87\x38\x8D\x7F\x87\xF5\x8C\xCA\x0E\xFE\x32\x84\x27\x6B\xB6\x71\xD2\x7F\x37\x8F\xCC\x67\xE0\x8C\x45\xE3\x40\x3C\x9A\x77\x83\x20\x79\xA5\x88\xC9\x7F\xE9\x8D\xEE\x8A\xA9\x1B\xDF\x2B\xB1\x25\x8D\xCE\x8E\x4E\x06\xBD\x85\x15\x8D\xD9\x8B\x1A\x15\x9F\x38\x80\x40\x9C\x7F\x6E\xE2\x89\x2C\x7B\x94\x8E\x5B\x75\xCA\x1A\xBC\x35\x9E\x77\x8E\xD5\x8E\xD2\x8F\x59\x8C\x4C\x8F\x13\x8F\xEB\x0D\x9C\x80\x5E\x67\x93\xEA\x7B\xE3\x8F\x53\x88\xA1\x84\x96\x8A\x97\x18\xE6\x3C\x8E\x78\x9B\xEE\x89\xE6\x8D\xB9\x8D\x6E\x8F\x39\x8D\xA7\x1C\x95\x3C\xA2\x77\x8F\xE2\x86\x53\x89\x8A\x8E\x7F\x8E", "\xE4\x8E\x67\x1E\xA4\x12\xA3\x72\x87\xE8\x87\x9B\x89\x79\x8E\xDA\x8A\x0D\x8E\x11\x18\x8A\xBC\x74\x4A\x8C\xF0\x8A\xE7\x88\xC6\x8F\x83\x8F\xDB\x8E\x11\x1E\xC8\x37\x8B\x71\x8A\xDE\x8D\xC4\x8B\x83\x8C\x12\x40\x03\x8D\x7E\xA2\x2F\x3C\x91\x26\x8B\xEE\x8D\xE7\x8D\xBB\x8D\x81\x8F\xEF\x8E\xBB\x1D\xBA\x37\xB5\x77\x8F\x6D\x3A\x5A\x8C\xDB\x58\xF9\x8A\x49\x60\x65\x19\xFF\x3B\x89\x7A\x8F\x6C\x81\xF4\x77\x97\x8F\x90\x8C\x39\x8C\x2C\x04\x84\x39\xAF\x73\x95\xF4\x83\xEA\x89\xC6\x8C\xA6\x8F\x19\x8F\x31\x18\x8C\x39\x8D\x5E\x96\xD7\x52\xD5\x8A\xA1\x7D\x24\x8F\x3C\x8F\xB2\x1E\xFB\x3C\x94\x79\x8C\xD4\x86\xE5\x8F\x8A\x8C\x96\x8F\x1A\x8F\x5A\x1E\x88\x1D\xAE\x55\x9F\xE4\x83\x71\x52\xD4\x8D\x6D\x8E\x5F\x8F\xDC\x1D\xB8\x3B\xAB\x79\x9E\xD5\x89\xEA\x88\x58\x8F\xAA\x8E\x19\x8D\x3D\x1A\x8D\xD9\x45\x1A\x56\xF6\x8A\xDC\x88\xDB\x8D\xA9\x8E\x6D\x8F\xA7\x1E\xEC\x3C\x87\x78\x8E\xF3\x89\xE0\x8D\x41\x81\xB1\x8E\xE5\x59\x49\x1A\xF5\xD3\x6D\x72\x9C\xF5\x87\xED\x8F\xD2\x8D\xB6\x8F\x4C\x8F\xA5\x1C\x89\x3A\xB4\x6F\x95\xE5\x86\xA7\x8B\xD1\x6C\x16\x68\xC0\x71\x7A\x1A\xF4\x3D\xA5\x7B\x96\xF7\x87\xEE\x88\xDF\x8C\x4B\x8E\x54\x8F\x6D\x1E\xBC\x3B\x9F\x7B\x84\xB6\x6D\xC0\x85\x0C\x8A\x32\x77\xFF\x8D\x02\x1F\xED\x3B\xA4\x7A\x96\xCA\x84\xE0\x89\xBE\x8E\x81\x8F\x38\x8E\xF4\x1D\xEF\x3C\x91\x6B\x8F\xE4\x8F\x1C\x84\x4D\x8E\x53\x7D\x5D\x8F\xC9\x1E\x96\x3D\xBC\x79\x94\xF8\x8B\xAC\x8B\xDB\x8D\xB3\x8D\x84\x8F\xAA\x1E\x9A\x3E\xB0\x3D\x67\xD2\x8A\xD0\x7C\x09\x8D\xFF\x85\xFD\x34\x41\x1E\xD7\x1D\xA7\x2A\x84\xF2\x89\xAA\x81\x3D\x8C\xB2\x86\x24\x8F\xDE\x0E\xCA\x3C\x86\x3C\x99\x3D\x8B\xCA\x6E\x0E\x8D\x3F\x8F\x42\x8D\xBE\x07\x8E\x38\x90\xE1\x65\x54\x8D\xE2\x8A\xC3\x8F\xAC\x8F\xE6\x86\x90\x0D\xE5\x34\xB7\x7A\x97\xCF\x83\xA5\x88\xBB\x6B\x1F\x88\x94\x8A\xF9\x04\xC6\x2B\xA2\x3C\x94\xE8\x8B\x3D\x75\xCC\x8D\xC8\x8F\x5E\x8F\x04\x1F\xA4\x3E\xAA\x79\x89\xF7\x8C\xED\x88\xE5\x8E\xB7\x8E\x95\x8F\x0D\xE4\x43\x3A\xB8\x1B\x66\xD5\x84\x0B\x8F\xDB\x60\x76\x8B\xE1\x73\x42\x6A\x31\x3E\x94\x3C\x99\x6F\x84\xF3\x8B\xBF\x86\x91\x8E\x51\x8A\x38\x1F\x84\x1E\xBA\x7C\x9D\x78\x83\xAC\x8C\x81\x8D\xD9\x6E\x44\x8C\x87\x1A\xA9\x69\x55\x7D\x86\xFA\x8A\xEC\x88\xCD\x8E\xD6\x8E\x3F\x8F\x26\x1F\xBA\x3B\x9E\x7D\x81\xEF\x89\xCA\x8D\xA1\x8D\x9C\x8F\x18\x7C\xDF\x0A\x90\x1A\x61\x2B\x99\xFB\x8A\x24\x84\xBE\x8B\xD2\x7A\x44\x8F\x7D\x1F\x8A\x3D\xAB\x3B\x8B\xE9\x80\x85\x89\x98\x8D\xB4\x8E\xA8\x83\x1C\x1F\xB5\xF4\x3F\x57\x81\x84\x46\xD5\x8C\xDF\x7E\xB6\x8C\xB0\x89\x86\xF8\x48\x05\x85\xFC\x75\xD5\x69\x92\x8F\x37\x7E\xB6\x3D\xB0\x8E\xA2\xFA\x12\x18\xA6\x4D\x1A\x53\x00\x72\x45\x5D\x8F\x58\x8E\x83\x00\x65\x1D\x9C\xEA\x10\x22\x45\x3C\x75\xB6\x8B\x7E\x10\xEB\x41\x34\x29\x71\x1D\xBB\x2C\x70\x00\x0B\xEB\x8A\x91\x3D\xAD\x8F\x5B\x8E\x8D\x80\xDE\x00\xED\xBE\x6C\x7E\x97\xFD\x8F\x76\x39\xF7\x8D\x55\x48\xBA\x8E\x4C\x76\x76\x3A\x91\x9A\x7B\xEB\x80\x47\x7F\xE5\x8E\xF0\x8E\xDB\x8F\x4D\x9C\x38\x3F\xB3\x6B\x63\xC2\x5D\xD7\x8A\x70\x07\x5F\x8F\xD6\x50\x81\x1D\x83\x3B\xB8\x5B\x88\xFB\x8E\x34\x33\xF8\x8D\xF4\x8F\xE2\x8F\xA2\x21\x54\x3F\x88\x76\x97\xA9\x22\xA4\x49\xAF\x82\x04\x3D\x53\x00\xE4\x1A\xA7\x02\x29\x02\x11\x34\x73\x42\x4A\x70\x39\xCC\x5E\x40\x29\xBB\xE6\x5F\xF1\x2C\x9A\x20\x74\x14\x73\x53\x88\x11\x58\x70\xFB\x8F\x8F\x9B\x71\x31\x94\xAC\x4F\xFF\x76\x51\x35\xF6\x00\xFE\x8E\x7B\x70\x0A\x17\xFD\x8B\x55\x39\x8E\x69\x15\x45\x6B\xB6\x85\xE4\x8E\x5A\x8F\x7F\x18\xC0\x39\xAB\x55\x8F\xF2\x51\xDD\x8C\xB6\x81\x4E\x8C\xDB\x82\x9D\x1B\xAB\x1A\x84\x77\x8D\x69\x85\x82\x57\xD1\x69\x01\x90\x23\x87\x1C\x0D\xD5\x39\xB9\x38\x97\xE6\x8D\xF5\x81\x9B\x8E\xE6\x8A\x41\x8E\xC8\xB5\x77\x37\x82\xAE\x79\xDF\x8B\x14\x82\x95\x89\x1D\x7F\xDD\x6C\x6F\x19\xB0\x37\x8C\x4E\x6E\xED\x70\x6B\x1F\x02\x93\xA7\x87\x74\x87\xA2\x1C\x93\x3F\x8C\x7A\x93\xDC\x8A\xEF\x89\xD0\x8C\xA4\x8E\x04\x8E\xD0\x1C\xC2\x11\x9A\x35\x84\x46\x87\xDE\x8E\x18\x86\xF0\x8C\x16\x90\x54\x4A\x2E\x40\xB2\x3A\x8E\xDF\x6B\xD4\x8B\x2D\x85\xB3\x8F\x2D\x8D\x58\x1C\xDD\x34\x9A\x71\x94\x6E\x8F\xF0\x7F\x79\x8D\x7E\x8E\xA5\x8B\x77\x87\x74\x32\x91\x79\x97\xB8\x62\x04\x90\xDD\x84\x11\x91\x94\x8E\x55\x1C\x94\x3F\x8E\x75\x87\xD3\x87\xF9\x8B\x2B\x66\xF7\x8C\xEE\x8F\x44\xD9\x55\x40\x81\x1E\x90\x01\x95\xD0\x8E\x78\x8F\x0C\x90\x09\x8F\x35\x20", "\x94\x3C\xB7\x80\x8C\xE8\x87\x17\x87\x7E\x68\xFB\x8D\xC4\x33\x16\x20\x99\x5B\x46\x80\x82\xF9\x8B\xEC\x8A\xC6\x8E\xD2\x8E\x1A\x8F\x4A\x20\xAA\x37\xAD\x5D\x89\x64\x68\xE2\x89\xFC\x66\x8A\x8E\x09\x6A\x9F\x19\x9C\x8A\x45\x28\x61\x02\x92\x07\x90\x03\x92\x59\x86\x0D\x90\x7D\x1C\x9C\x40\x98\x5E\x9E\x00\x99\xC2\x88\x04\x93\x0A\x8F\x04\x8E\xA4\x01\x80\x2F\x80\x71\x8A\xA9\x86\x27\x8A\x36\x8C\x1C\x91\xF0\x8F\x85\x20\xAF\x40\x97\x81\x91\x01\x95\xBB\x8F\x0C\x92\xA6\x8F\x59\x8E\x4C\x1C\xFC\x3D\x8E\x71\x97\x0A\x8F\xFE\x86\x37\x8F\x7E\x8F\x07\x8E\x50\x1E\xE8\xCA\x71\x81\x92\x76\x53\x07\x90\xEB\x8F\xC8\x8F\x01\x8F\x25\x1F\xDC\x3E\xA7\x7C\x8B\xF7\x8A\xF0\x88\xEC\x8C\xEB\x8C\x2E\x8F\xC1\xDD\x5F\x3C\xAE\x66\x94\x04\x95\xD3\x88\x2C\x86\x19\x49\x41\x90\x71\x61\x62\x40\xA0\x37\x84\x03\x9F\xBE\x8F\x7A\x8D\xFC\x8D\x88\x8B\x13\x1E\xA1\x34\x82\x7A\x85\xFC\x80\x09\x97\x00\x8B\x0F\x8F\x17\x8E\x4D\x06\x8C\x3F\xAB\x28\x57\xBD\x85\xAD\x7B\x15\x92\xA2\x59\x56\x90\xF5\x1E\xAF\x41\x9E\x78\x8D\x79\x8F\xC6\x8A\xBE\x8C\xC6\x8E\x04\x8F\xC7\x14\xDD\x99\x49\x26\x8A\xFD\x81\xD7\x36\xB1\x8D\x9D\x5A\x6C\x90\x03\x1F\xDA\x41\x90\x66\x83\x50\x80\xE2\x8A\x4F\x86\x88\x8F\xED\x87\xB6\x20\xC1\xF0\x1C\x71\x9F\x1E\x76\x0D\x90\x74\x58\x3A\x90\x89\x8F\xE6\x1E\xFF\x3E\xA6\x7A\x96\xF8\x88\xF0\x8C\x16\x91\xCA\x8F\x76\x8F\x76\x6D\x20\x3D\xAD\x08\x55\x07\x97\x0E\x96\x10\x93\x8D\x86\x44\x90\xB0\x1C\x8A\x41\xB8\x70\x95\xE7\x82\x53\x8F\x9E\x8E\x5B\x87\x6E\x8E\xEC\x1C\xBA\xF2\x6C\xF6\x78\xE3\x86\x3B\x44\x20\x90\x57\x63\x7B\x90\x01\x1E\xAB\x1E\x9B\x83\x8E\xE3\x8D\x0E\x93\x92\x8B\x3B\x90\xFD\x8A\xA4\xE9\x3A\x3D\x8F\x7E\x8D\x01\x99\x09\x93\x08\x93\x11\x77\x22\x90\x82\x0E\xC7\x40\x8E\x6A\x89\x02\x90\xA9\x8B\x09\x92\x91\x8D\x77\x8F\x33\xCF\x47\x3D\xA8\x98\x62\x52\x36\x0E\x97\x22\x92\x41\x91\x0B\x84\xAF\x1C\xDB\x1E\x8A\x84\x83\xE3\x8C\x10\x92\xAB\x8A\x43\x91\xBE\x8B\xFE\x1E\xC2\x20\xB4\x68\x9B\x5A\x86\x11\x95\x33\x60\x46\x90\x0E\x8F\xA9\x06\x9B\x42\xB0\x77\x9D\x06\x97\xF1\x8F\x23\x92\x1C\x8E\x80\x90\xC4\x1D\x9A\x1D\x83\x80\x84\x09\x9C\x0A\x97\x26\x92\x93\x85\x9C\x90\x36\x1C\xBB\x42\xBF\x71\x9D\x09\x9E\x7B\x8F\x27\x90\xF0\x8B\x1B\x88\x11\x21\xD4\xFB\x73\xA7\x71\xF7\x8E\xF5\x75\x4C\x79\x51\x90\xCD\x5D\x47\x21\xC2\x3C\xA5\x18\x8D\xFB\x8A\xED\x86\xE6\x8C\xB7\x87\xB8\x8F\x1B\x0F\xF3\x3E\x94\x8D\x75\xD2\x80\xF0\x8E\x6C\x85\x18\x91\x92\x90\x56\x20\xA7\x42\x98\x81\x8D\xE3\x8B\x14\x95\x23\x93\x5E\x8C\xB8\x90\x25\x10\xF2\x42\x91\x8E\x64\x83\x81\xA6\x8A\xDD\x54\x26\x91\xAA\x90\x9A\x20\xFA\x42\x9C\x82\x88\xE4\x87\x0C\x91\x7B\x8D\x32\x91\xDC\x8D\x5F\x1F\xD0\x42\x9E\x56\x9E\xE6\x88\xEA\x78\x9C\x8D\x65\x75\xC3\x90\xD7\x20\xD6\x42\xBD\x35\x88\x08\x9A\x13\x93\x9E\x8F\x92\x86\xAE\x90\x3A\x1C\xDE\x42\xBC\x70\x8B\xE7\x85\xC7\x8A\x27\x7E\x3B\x8F\x18\x6C\xC2\x20\xA4\x1C\xB1\x3D\x87\xE2\x83\xF7\x81\x89\x8E\xD4\x8B\x4D\x8F\x8F\x1E\x9D\x3D\x91\x7A\x86\xF5\x77\xF0\x85\x0C\x8D\x20\x88\xA0\x8F\xC8\x15\xA3\x65\x61\x4C\x8A\x05\x98\x19\x96\x1E\x92\x66\x91\xAC\x87\x58\x21\xE1\x38\x9A\x85\x92\xE5\x8C\x08\x94\x96\x8E\x23\x90\x5B\x8E\xB0\x10\xAA\x26\xB1\x8F\x67\xC3\x80\xC0\x6E\xC9\x8D\xFD\x70\xE5\x8A\xE1\xBC\x67\x42\xAC\xFD\x49\x0B\x92\xF3\x88\xAA\x87\x79\x8C\x63\x87\x6E\x21\x99\x1E\x80\x86\x84\xA5\x8D\x9E\x8A\x6F\x4F\xAC\x8C\xA8\x8F\x8C\xEA\x13\x9E\x6F\x1F\x9D\xF1\x87\xF6\x89\x3A\x91\x6F\x91\x82\x90\x89\x21\xDA\xD8\x7B\x85\x9E\xE5\x8C\x5D\x8B\xF5\x8A\x77\x8B\xD6\x8B\xF9\x1C\xB2\x7F\x5D\x65\x70\x1D\x84\xEC\x78\xEF\x8F\x91\x89\x3E\x7F\xA9\x10\xFC\x9F\x40\x83\x8F\xCE\x49\x1A\x92\xE8\x87\x6A\x90\x30\x8E\xAD\x21\xB1\x39\xAF\x86\x80\x05\x9C\xE9\x8A\x14\x92\xA7\x8E\xDA\x90\x98\x10\x90\x3A\xA0\x6C\x89\x6B\x78\x33\x8F\xDB\x63\xB1\x8C\xDF\x8E\xED\xD8\x7D\x43\xB0\x3D\x91\x2A\x8C\x1A\x92\x80\x8D\xD4\x8A\x02\x8E\x8E\x1E\xB9\x33\xAB\x81\x96\xF0\x8E\x83\x8A\x6B\x88\xB5\x8C\xAE\x89\xD1\xD1\x57\x3A\x9B\xE6\x79\xEA\x88\xD8\x71\x00\x92\x3D\x64\x20\x90\x9C\xDB\x12\x44\xB6\x38\x98\x09\x9C\x19\x91\x2B\x92\x67\x90\xDE\x8B\xA0\x21\xE5\x38\xA2\x86\x94\xD2\x4D\x00\x94\xF9\x3A\x8A\x89\x9D\x8C\xAC\x14\xE2\x05\x82\x80\x9C\x20\x83\xC2\x6A\x45\x92\x67\x87\x23\x87\xE3\x1C\xC9\x1C\xAF\x88\x98\xE4\x81\x23\x91\x90\x8F\x8C\x90\x2A\x59\x7B\x20\xBD\xBB\x6F\x5D", "\x90\x00\x9E\xBA\x01\xB7\x80\x99\x82\xA8\x80\x2E\x12\x9D\xFD\x3F\x67\x7E\x11\x9C\xEF\x84\x42\x85\x90\x90\x4B\x8E\x43\x22\xD8\x39\x85\x89\x9A\xE4\x8E\xD1\x8F\x99\x8E\xB2\x7A\xAF\x8C\xAE\xF8\x3C\x29\xBA\x5C\x9E\x01\x93\xD1\x6C\x59\x07\x94\x90\xBC\x90\x63\x20\x9B\x41\xA5\x81\x8B\xF4\x8D\x18\x92\x91\x8F\x63\x91\xED\x8D\xC3\x1E\xA1\xB1\x69\x17\x91\xCB\x8B\x5E\x87\x50\x8D\x7B\x82\xA4\x75\x76\x21\xA2\xB3\x54\x89\x93\x78\x83\xEC\x83\x34\x86\x7F\x8D\xFA\x8B\x00\x1A\x82\x1E\x9B\x87\x96\xA5\x82\x18\x96\xD5\x4F\x17\x91\x99\x90\x71\x6D\x4C\x3F\xA8\x87\x86\x09\x9A\x1E\x93\x31\x92\x4A\x8E\x4F\x90\xF9\x1E\x99\x44\x86\x70\x9B\x10\x93\xE8\x8C\x14\x93\xD8\x8B\x9F\x8C\x86\x21\x89\xB6\x7B\x89\x8E\x6A\x85\x1D\x93\xC8\x8F\x75\x91\x8B\x87\xD9\x21\xB4\x29\x83\x8A\x86\xA6\x85\x4A\x8F\x44\x88\x66\x8D\x5B\x90\x41\x0D\xAC\x1B\x9E\x61\x70\xE7\x7A\x1F\x91\xF5\x32\xA2\x90\x9B\x90\xE9\x21\xF6\xDA\x6B\x87\x8C\xEA\x88\xAD\x83\x0B\x92\xE5\x8E\xF8\x90\x7E\x17\x9E\x2F\xB9\x78\x93\x04\x94\x7B\x8D\xFF\x8B\xE0\x81\xED\x71\x66\x22\xD3\x3F\xA8\x89\x83\x06\x9A\x26\x95\x18\x92\x41\x8F\x36\x91\x08\x1D\x92\x45\x99\x70\x92\x0D\x98\x03\x97\x4B\x93\xE5\x80\xC8\x8B\xBE\x22\xFB\x9F\x5B\x8F\x7B\x0F\x9F\x2A\x96\x28\x93\x6F\x91\xFF\x90\xC1\x21\x81\x44\x83\x87\x83\x10\x95\x1C\x91\x14\x93\x71\x91\x7E\x8F\xCD\x20\xBA\x45\xA5\x06\x9B\x7F\x86\xF7\x8E\xCE\x8D\x8F\x8E\xD3\x8B\xE7\x09\xA4\x3F\x83\x8B\x8A\x0D\x94\x21\x90\x40\x92\x85\x90\xD7\x90\x18\x22\xB0\x43\x9A\x88\x8C\x16\x9C\x06\x91\xFD\x67\xFD\x77\xED\x6E\x9E\x12\xE1\x33\xB7\x79\x83\xE2\x83\x05\x93\x4C\x6F\xA6\x90\x84\x83\xF8\x20\xD9\x3E\xB0\x82\x9B\xFA\x8C\x0F\x92\xDD\x8F\x37\x90\x76\x8F\xE1\x20\xBF\x1F\xAA\x4A\x9A\xF5\x67\x26\x90\x31\x90\xA3\x90\x59\x91\x8E\x22\xD9\x40\x90\x8A\x87\xF8\x86\x30\x96\x29\x91\xC6\x8E\xC9\x90\xD5\x6D\x73\x41\x98\x90\x6D\x18\x99\x19\x91\x56\x93\x72\x77\x88\x91\x7C\x21\x95\x3E\x8C\x85\x9D\x07\x97\x30\x95\x16\x90\xC6\x91\x6C\x83\x69\x1C\xC1\x13\x9A\x8A\x8B\x17\x9E\x1F\x95\x5D\x91\xB6\x91\x77\x91\x02\x22\xF1\x45\x84\x88\x91\x0D\x96\x20\x93\x36\x91\x87\x90\xED\x7B\xAF\x1E\x86\xB0\x72\x76\x82\x16\x9E\x30\x91\x2F\x91\xA3\x91\x35\x91\x32\x20\xC8\x45\x8D\x7A\x92\x17\x93\x29\x94\x5E\x90\x8B\x1C\x0D\x8D\x2F\x6D\x1C\x46\xBE\x86\x9E\x18\x9E\xEA\x70\x68\x91\x27\x90\xA1\x91\x34\x20\xCA\x45\x8A\x74\x94\x14\x9C\x0C\x90\x2C\x91\x69\x90\xB1\x90\xC0\xAB\x32\x42\xBD\x8B\x89\x14\x9F\x2F\x97\xD1\x85\x46\x90\xF7\x8E\x4A\x21\xA2\x46\xBE\x85\x90\xE3\x86\x31\x90\x1C\x91\xA1\x90\x63\x83\xDE\x12\xD5\x41\xBC\x8C\x9D\x18\x9F\x30\x97\x63\x92\xD3\x90\xC6\x90\x16\x1C\xC8\x41\xA9\x81\x8A\x06\x94\x35\x91\xBD\x84\xAF\x87\x72\x89\xAC\x1C\xD3\x42\x88\x6F\x7D\x1A\x99\xF2\x87\x6B\x93\xC4\x8F\x81\x91\x80\x1F\xB2\x41\x82\x7E\x9E\x07\x91\x19\x91\x61\x90\x9D\x86\xCA\x90\xCA\x6D\x53\x0E\x81\xBE\x46\x0B\x9B\x36\x93\x69\x91\xDB\x91\xA6\x91\xC6\x22\xE6\x40\x90\x8D\x88\x03\x92\x35\x93\xDF\x8F\xB7\x91\x51\x90\x3D\x07\xF4\x42\x87\xA8\x64\x0A\x9D\x38\x93\x51\x92\xCF\x90\x88\x91\x6F\x23\x8F\x45\x93\x8E\x9F\x04\x9D\x2D\x95\x40\x93\xE5\x91\x03\x91\x96\x22\xD1\x39\x8F\x7C\x92\x12\x9D\x39\x90\x56\x93\xE3\x90\x61\x77\x91\x23\xEC\x44\xB1\x8D\x8E\x0C\x93\x37\x90\x32\x90\xE1\x8E\xBB\x91\x81\x15\xA9\x20\x96\x86\x8C\x1D\x9B\x32\x95\x67\x91\x9A\x90\xC5\x90\xA1\x23\x92\x46\xA3\x8E\x91\x14\x94\x34\x93\x59\x91\xCD\x91\x66\x91\xA4\x21\xB8\x39\xB6\x39\x92\x8D\x87\xD3\x8A\xB3\x4D\xEF\x90\xB6\x91\x9F\x23\xEE\x46\xB1\x8E\x81\x1A\x93\x3B\x96\x4D\x91\xED\x90\x38\x91\x83\x18\xC7\x39\x14\x61\x83\xD4\x8D\x31\x8A\x2B\x7F\x41\x77\x2C\x8C\x82\x20\xAE\x45\xBC\x8D\x9D\x55\x8E\x0A\x95\x0E\x93\xAF\x8F\x3B\x90\xC1\x1E\xEF\x43\x91\x62\x8A\x0E\x94\xA7\x74\x39\x90\x3F\x82\xE7\x90\x6A\x18\xD0\x43\xB6\xAE\x6A\x1A\x9E\x39\x97\x77\x93\xCF\x91\xE9\x91\x4F\x23\xD5\x47\x89\x8B\x85\x1E\x93\x35\x96\x68\x91\xA5\x90\xB1\x87\x87\x1F\xCB\xDA\x7C\x73\x81\x0F\x90\x92\x6B\x3C\x92\x34\x91\x3D\x8C\x33\xDB\x63\x47\xB6\x22\x87\x00\x98\xF4\x8D\xD6\x8D\x7B\x91\x47\x8C\xEA\x23\x8D\x39\xA3\x42\x95\xFB\x8A\x0B\x93\xFC\x87\x8E\x80\xFB\x90\x42\x1F\x9C\xF0\x78\x6A\x8A\x4C\x85\x2D\x90\x2D\x93\xB5\x90\x97\x91\x2D\x22\xC2\x43\x99\x89\x9D\x00\x9B\x25\x92\x9B\x8D\x97\x90\x6E\x8E\x42\x1D\x89\x44\xB6\x86\x85\x7B\x88\x44", "\x71\x83\x90\xB8\x7F\x7F\x00\x0F\x22\xAD\x13\xB4\x8F\x8E\x1D\x91\x3D\x90\x72\x90\x05\x8E\xF8\x8D\xFA\x23\xC3\x46\xB3\x8C\x93\x17\x97\x3C\x95\x5E\x90\x44\x91\xAB\x91\x14\x07\xFC\x20\x63\xE1\x62\xC5\x87\xAD\x8A\x18\x8A\x9B\x6B\x3F\x7C\xFA\x0A\xE4\xCE\x59\x04\x48\xFF\x81\xB0\x8C\x19\x8E\xC4\x8C\xC3\x57\x84\x02\xB8\x16\x13\x4A\x2C\x98\x2C\xBF\x01\xF9\x8C\xB7\x73\x80\x00\xEB\x1F\x9C\xEA\x23\x50\x50\xD8\x87\x35\x02\x64\x8C\xC5\x55\x28\x92\xCF\x33\x53\x48\x89\x18\x15\x22\x9A\x8A\x3F\x25\x07\xFB\x8E\x26\x3B\xF1\x1F\xB8\x04\x73\x7F\x91\x34\x7F\xFF\x8A\x9A\x54\x8B\x8A\xAD\x3B\x80\x52\x60\x48\x92\x4B\x22\x23\x9B\x5F\x18\x50\x2B\x4B\x05\x36\x92\x64\x9B\x7A\x3F\x86\xBE\x46\xFF\x88\x8B\x33\x17\x00\x4D\x70\x64\x88\x8D\x02\xE4\x3A\xAA\x15\x8F\x14\x61\x1D\x8A\x72\x68\x13\x67\x2F\x07\x2C\x82\x22\xCE\x6A\xA9\x52\x40\x0C\x44\x1C\x75\x69\xBA\x72\xB8\x07\xAB\x00\x11\xCD\x71\x28\x42\x9C\x3B\xCB\x45\x3A\x84\xA7\x02\xF2\x39\xB7\x67\x66\xE7\x1C\xB4\x2A\x44\x4E\x6B\x36\x17\x39\x38\x00\x06\x5F\x9F\x24\xFA\x91\x47\x92\x8F\xF1\x51\xA0\x60\xEE\x05\x31\x01\x48\x73\xDD\x00\x0C\x7C\x69\x92\x9A\x47\x6C\x67\x8A\xD2\x88\xF3\x02\x44\x70\x6A\x16\x89\x77\x2C\x9A\x21\x06\x01\x69\x71\x1B\x00\x83\x5E\x5B\x92\xAC\x24\x91\x2D\x8F\xCC\x2E\x5B\x7F\x1C\x88\x02\x04\xDC\x06\x60\x00\x91\xE6\x58\x01\x0C\xF8\x42\x26\x99\x4B\x97\x15\x83\x2E\x93\x87\x6E\xA7\xDE\x2B\xA5\x70\x3D\x1A\x05\x01\x69\x73\x1A\x00\x83\x5E\x67\x92\xC5\x24\xE4\x0C\x45\xC4\x1F\xFC\x40\xF7\x00\x17\x01\xA4\x72\x69\x00\x0C\xBE\x58\x49\x91\x93\x82\x46\x43\x4D\x97\x52\x4F\x49\x01\x5A\x00\x91\xE6\x51\x01\x0C\xF8\x42\x27\x9B\x4D\x93\x97\x8F\xBD\x36\x3F\x8B\xAA\xD7\x2C\xE6\x3E\xC2\x30\x06\x0C\xE0\x5C\x9D\x92\x28\x92\x58\x8A\x2A\x6C\x1A\x60\x14\x93\x87\xDE\x32\x16\x6F\x19\x00\x83\x5E\x7B\x92\xEF\x24\xF0\x28\xA4\x58\x46\x60\x3E\x4D\x91\x21\x02\x2C\x01\x48\x73\xCE\x00\x0C\x7C\x41\x94\x85\x27\x94\xC4\x8E\x61\x38\x3A\x92\x83\x6C\x70\x0F\x36\x01\x11\x9A\x6D\x06\x0C\xE0\x5C\xA1\x91\x3E\x93\xCC\x88\x8B\x05\x0C\x22\xBD\x93\x86\x08\x0C\x0A\x01\xD2\x73\x00\x1B\xB0\x70\x17\x25\xDC\xDC\x45\x62\x9D\x65\x47\x31\x2C\xD5\x31\x2E\x01\x48\x73\xF4\x0D\x82\xE7\x25\x3B\x96\x24\x94\x45\x03\x94\x90\x4F\x62\xB8\x07\xC3\x00\x11\xCD\x6E\x29\x8D\x3B\x70\x20\x8E\x5A\x00\xC9\x54\x86\x80\xAC\x66\x3F\x01\x11\x9A\x72\x32\x89\x91\x8D\xA5\x92\x3C\x03\x43\x92\x95\x5F\x5C\x0F\x99\x17\x8C\x35\x3C\x0B\x01\xD2\x71\xCB\x80\xC1\x39\x32\x05\xF8\x0F\x83\x0B\x06\x29\x9C\x22\x46\x59\x80\x08\x3B\x84\x00\xB4\x24\x9C\xEA\x03\xF7\x62\x9C\x30\xEB\x7A\x49\x84\xA7\x03\x56\x92\xC7\x24\xA8\xFA\x5B\xF3\x66\xF7\x7F\xEA\x36\x70\x29\xA4\x73\x81\x7B\x82\x73\x39\xF0\x57\x19\x97\x29\x91\x03\x84\x94\x91\x0A\x66\xB8\x07\xBE\x00\x11\xCD\x4B\xB8\x62\x9C\x3E\xFC\x72\x49\x65\xA5\x02\xA2\x92\x20\x87\x4F\x10\xBF\x4A\x63\x08\x02\x25\x14\xE6\x52\x0A\x76\xD0\x3E\x39\xE7\x50\x0D\x6B\x6C\x86\x0E\x0D\xB2\x8B\x1F\x83\x75\x69\x93\x00\xBD\x00\x11\xCD\x46\xA2\x62\x9C\x3D\xAA\x70\x4F\x67\x59\x93\xAE\x92\x9C\x7F\x5B\xCD\x67\x04\x0D\x05\x0D\x4C\x97\xCD\x72\x0C\x73\xB8\x92\x2B\x87\x24\x56\x5E\x7B\x30\x19\x1C\x6A\x30\x98\x90\x47\x3B\xAE\x6E\x82\x73\x23\xF8\x5E\x23\x74\x22\x00\x55\x97\xA0\x90\x4D\x6E\x56\x33\x3F\xD3\x62\xA2\x64\x69\x69\x38\x35\xC0\x6E\x90\x90\x60\x93\x44\x92\x08\xE7\x4D\x40\x94\x32\x01\xA2\x11\xE1\x19\xAE\x1C\x34\x07\xBF\x73\x14\x98\x18\x4B\xBE\xC2\x30\xCE\x4C\x59\x96\xA5\x14\x62\x92\x7C\x45\x68\x25\xAC\x07\x4A\x92\x81\x12\x73\x43\x1B\xB3\x7E\xD2\x8D\x47\x92\x27\x01\x19\x4B\x93\x4A\x72\x9D\x6D\x5A\x90\x9A\x6B\x6B\x92\xA4\x45\xB1\x25\xCD\x38\x73\x96\x85\xDE\x7B\x3A\x68\xB5\x92\x24\x6A\x56\x33\xAE\x00\x11\xCD\x7E\x33\x62\x9C\x3E\xEF\x66\xAC\x93\x25\x93\xCF\x92\x47\x24\xF9\xFD\x57\x11\x4C\x35\x34\x0B\x01\xD2\x72\x5D\x64\xC1\x39\x3B\xCB\x5B\x0B\x8F\x97\x8B\xBE\x3B\xA6\x0B\x9E\x92\x67\x51\x48\x73\x79\xC6\x02\xE7\x22\x22\x6E\x2E\x95\x52\x92\x66\x39\x77\x93\x89\x92\x93\xE0\x13\xA5\x70\x0C\x62\x9C\x3B\x5B\x62\xA8\x93\x70\x01\xE0\x92\xF7\x21\xC7\x4A\x9E\xB1\x11\x34\x7B\xF9\x5A\x70\x3B\x7C\x60\xBF\x92\xDB\x25\x8F\xFF\x1C\x8D\x1E\x2E\x98\xF9\x58\x08\x09\x4A\x5C\xC1\x39\x5A\xBB\x5A\x4B\xA5\x97\x89\x06\x89\x53\x90\xBD\x92\x40\x00\xDD\x2A\x62\xD1\x55\x6B\x42\xCE\x23\xC3\x5A\xC9\x7C\xAB\x92\x86", "\x43\xF7\x7C\xE9\x24\xA7\x02\x3F\x93\x9C\xA8\x3B\x1F\x5A\x70\x38\x32\x5B\xC9\x92\xC3\x02\x15\x4B\xA7\xBC\x25\xFE\x40\xF7\x01\xB9\x90\x47\x3B\xBC\x56\x82\x73\x1F\x61\x42\x98\x83\x2A\x90\x5D\x90\xAB\x8C\x31\x88\x1F\x01\x70\x0F\x57\xC0\x74\x9C\x48\x10\x22\x52\x97\xB7\x91\xCE\x48\xF8\x92\xFD\x04\xE8\xE5\x27\x04\x07\x25\x99\x0C\x7E\xB0\x93\x9B\x28\x17\x93\x25\x94\x1A\x4C\x93\x5A\x9C\x03\x7D\x62\x70\xFF\x6C\xDC\x07\xC9\x2B\x62\xD1\x24\xDF\x02\xCE\x3C\xEC\x43\x62\x97\xBD\x91\x89\x93\x26\x4E\x98\x9C\x2C\xCD\x39\x95\x9C\xA8\x37\x17\x4A\x70\x38\x23\x4B\x06\x93\x7F\x25\xC9\x01\x9E\x95\x86\x36\x71\x31\x4C\xD5\x30\x82\x93\x49\x69\xA1\x71\x02\xE7\x29\x77\x98\x11\x4E\xA5\x3C\x59\x10\x7F\x93\x81\x00\xAF\x00\x60\x00\xB6\x98\x99\xBA\x8F\x8D\x3B\xD7\x71\xF4\x39\x6F\x92\x91\xE6\x50\xEB\x0C\x95\x98\x31\x9B\xC9\x4A\xC7\x93\x2B\x92\xF1\x8A\x19\x8E\x0E\x29\xA9\x8B\x8B\xF3\x11\x4B\x5E\x20\x3E\x5C\x8F\xE3\x83\x55\x22\xEC\x15\x98\x74\x84\xE7\x8C\xD3\x8C\x9E\x8E\x4F\x8E\x7B\x8E\x27\x24\xA4\x1A\x97\x52\x93\xD9\x81\xDC\x8F\x01\x92\x50\x87\xDB\x82\x9E\x1B\xE7\x24\xA0\x6E\x98\x14\x9C\x1B\x91\x21\x00\x1E\x92\xD0\x5F\x77\x26\x9C\x11\xBC\x2D\x7D\x14\x9B\x16\x97\x53\x92\x71\x8D\x50\x91\xC8\x19\x82\x34\xAD\x5F\x87\x0A\x82\x02\x91\xC6\x74\x09\x91\xC0\x80\x1B\x12\xC3\x1A\xB6\xF1\x6F\xDD\x8F\xC8\x61\x4A\x92\x62\x85\x47\x93\x54\xC3\x11\x4D\xB9\x24\x9F\x73\x8B\x93\x81\xD0\x85\x4F\x85\x46\x8D\x70\x18\x8F\x35\xB8\x7A\x91\xD4\x8E\x87\x70\x4C\x93\x2E\x8A\xD9\x53\x3D\x20\xAB\x1F\xA5\x39\x68\x35\x9B\x75\x62\xD5\x93\x59\x84\x22\x7F\x69\x09\xC6\xFC\x46\x81\x8B\x4E\x87\xE5\x8E\x3D\x91\x96\x8E\x5C\x91\xA9\x23\xF3\x44\x8A\x53\x92\xCB\x8C\x5E\x82\x0A\x93\x01\x6D\x47\x19\x75\x26\xA7\x1E\x95\x3B\x9C\x14\x9B\xF6\x8C\xC2\x86\xA5\x93\x22\x8F\x98\x26\xC7\x3C\x9A\x9A\x99\xBF\x84\xA0\x8B\xA8\x6D\x3C\x85\x77\x83\xA7\x48\x51\x4D\x94\x3B\x95\x71\x8F\x23\x91\x03\x93\x95\x90\x6B\x8E\x23\x24\x8B\x41\xA5\x90\x9F\x00\x97\x24\x94\xF3\x89\x1B\x90\x0D\x83\x8C\x26\xCE\x47\xAE\xCA\x02\x37\x95\x6A\x83\xDA\x90\xC0\x90\xBF\x91\xF9\x20\x80\x47\xBB\x83\x83\x19\x95\x31\x94\x2F\x8C\xFB\x86\x6D\x81\x83\x26\xE2\x27\x85\x9A\x9A\xCC\x83\x99\x64\x5E\x05\x65\x65\x20\x88\x1B\x09\xDB\xC7\x7C\xB7\x5C\x35\x9C\x8F\x66\xD7\x92\x6C\x84\x56\x93\xB4\x09\xAE\x4D\xB6\x26\x90\x35\x99\xA3\x8A\xD6\x90\xD3\x8F\xDD\x8D\x4D\x19\xAD\x38\xB1\x49\x9A\xF1\x85\x2E\x92\x5F\x91\x8F\x8E\x4B\x90\xF0\xB9\x0E\x4D\xB4\x9B\x94\x71\x8E\x58\x86\x6B\x90\x52\x90\x01\x8F\x61\x23\xB1\x41\x85\x8C\x9D\xFA\x84\x38\x97\x76\x91\xBC\x87\x14\x90\x8F\x17\xA6\x41\x86\x25\x94\x49\x81\xD7\x34\xE1\x90\xE5\x68\x87\x93\xC6\x09\xDD\x08\xAE\x27\x9D\x3A\x84\x2B\x96\xD6\x8C\x1E\x91\x96\x90\x36\x1E\xA4\x2A\xBE\x36\x99\x05\x9C\x3D\x90\x35\x81\x34\x91\xF8\x92\xE7\xC9\x50\x0C\xB9\xA6\x36\x39\x92\x70\x68\xE7\x90\x7B\x84\x6A\x85\x3B\x27\xD6\x15\xBD\x9C\x8F\x20\x9F\xD4\x8E\x4D\x8B\x68\x80\x67\x90\x26\x15\xBC\x45\xA1\x79\x9A\xC3\x88\xD5\x7C\x1A\x92\xDE\x90\x39\x25\x23\x27\x90\x1C\xA4\x9B\x99\x33\x9F\xD9\x83\xCF\x92\x90\x91\x3E\x93\x9F\x21\xFF\x4C\x8D\x84\x81\x34\x9F\x10\x91\x92\x4F\x38\x91\x56\x4A\x5C\x0A\x4C\x4E\xA9\x66\x6E\x3A\x98\xA2\x87\xE8\x8E\xC4\x92\xE7\x86\x14\x27\x8A\x40\x98\x68\x83\xAB\x85\x33\x5A\x63\x92\xA6\x3D\xB8\x93\x61\x27\x95\x09\xB6\x9B\x86\x39\x9A\x16\x92\x06\x87\x3A\x91\xBC\x8C\x63\x23\xDE\x41\xA5\x8D\x88\x18\x97\x36\x94\x72\x5A\x40\x91\xFD\x90\x72\x27\xAA\xB8\x74\x9D\x93\x56\x8D\xD8\x81\xE0\x76\x71\x82\x07\x92\xF5\x19\x96\x4E\xBB\x68\x84\xD1\x81\xEE\x87\x8E\x8D\x84\x8D\xB3\x7D\xFB\x69\x11\x4F\xB6\x6E\x73\x3C\x9C\xD8\x86\xEE\x92\xB0\x93\x94\x90\xC4\x26\xCE\x3D\x86\x9B\x90\xF6\x86\xD1\x60\x69\x93\xFF\x52\x68\x93\xBE\x9C\x24\x4F\x94\x87\x95\x36\x98\xED\x84\x2D\x91\x64\x8D\xB7\x8F\x93\x19\xFE\x4D\x95\x66\x86\x1C\x9E\xEE\x89\xF3\x8D\x10\x83\x1D\x88\x8C\x8C\x00\x4F\xB1\x9E\x87\x2D\x87\x6F\x97\xE4\x92\x46\x91\xC3\x93\x1F\x1E\xB8\x4F\xA1\x78\x9A\x3D\x93\xE2\x8C\xF7\x90\x50\x81\xF5\x7E\x5F\x27\xC6\x9A\x01\x9E\x86\x38\x83\x78\x95\x6F\x92\xF1\x92\xB0\x91\xC8\x27\xDC\x41\x89\x9E\x8D\x0A\x9C\x7C\x90\x1E\x93\xC9\x90\x84\x93\x8E\x10\x52\x42\x97\xF7\x62\x3D\x94\xEA\x62\xF6\x93\x07\x93\x39\x83\x37\x24\xC6\x41\xB9\x90\x91\x1A\x9C\x3F\x96\x72\x91\xBB\x93\x47\x90\x56", "\x23\xCA\x47\x89\x8E\x84\x0B\x95\xE1\x7B\x24\x91\xB8\x93\xE1\x93\x59\x07\xFE\x1C\x80\x9B\x80\x74\x87\x7A\x97\xD5\x92\x4A\x91\x58\x93\x2C\x21\xB3\x4D\xAE\x84\x85\x50\x7F\xEF\x8B\x73\x90\x8F\x91\xFB\x93\x60\x9D\x66\x4F\x8C\x8D\x90\x1D\x99\x7E\x97\x58\x93\xFA\x92\xCA\x91\xED\x27\xB6\x40\xBE\x8F\x95\x1A\x9E\x2C\x92\x75\x90\x52\x7D\xAD\x75\xE4\x27\xA0\x86\x4A\xA0\x8F\x1D\x92\xF9\x71\x78\x91\xC8\x90\x95\x93\xFC\x26\xAC\x4E\xA5\x8C\x9F\x07\x9E\x7C\x92\xA3\x69\x58\x91\x20\x92\x27\x96\x3B\x47\xA7\x9A\x93\x3E\x95\x79\x83\xEC\x90\x9F\x91\x7E\x87\x7E\x22\xBB\x3A\xBF\x67\x9C\xBE\x81\xA0\x8E\xFB\x88\x50\x8E\x75\x8E\x1F\x18\xA7\x50\x9D\x1A\x8E\xF9\x80\xED\x81\x03\x96\xC8\x6D\x0D\x94\x35\x24\x8C\x50\x95\x88\x95\xE0\x87\x21\x97\x82\x8D\xE5\x90\x09\x94\x3D\x24\x9C\x44\x80\x90\x87\xEE\x5E\x57\x81\x13\x88\x86\x4A\xEF\x91\x1A\x02\xE0\x47\x84\x0E\x89\x3D\x3E\x83\x90\x97\x60\x10\x94\xFB\x91\xA0\x23\xF8\x47\xB0\x8D\x85\x42\x92\x37\x97\x08\x96\x1A\x91\x09\x94\xB8\x23\xF1\x43\x80\x7F\x7B\xE7\x85\x5B\x89\xA2\x8E\xD4\x8F\x89\x8E\x27\x02\xB4\x4E\xA1\x9E\x8C\x41\x97\x85\x94\x58\x90\xF0\x90\x2D\x94\xA2\x23\x8F\x50\xA4\x8E\x8B\x37\x9D\x08\x97\xFD\x90\x72\x91\x94\x89\x62\x1F\xA5\x35\xA3\x74\x85\xFB\x83\x2A\x5D\x3C\x90\x84\x90\xE1\x93\x09\x28\xC4\x4F\x84\x9E\x94\x34\x96\x78\x96\xF6\x90\x3B\x90\xE5\x93\xEE\x20\xDD\x4F\xA0\x84\x9F\x3E\x97\xA9\x81\x0F\x96\xD0\x89\xFA\x90\x4F\xED\x51\x1E\xAA\xA1\x8C\x4E\x35\x85\x95\xBC\x69\x1B\x94\x76\x91\xE8\x27\xC3\x50\xB8\x90\x9C\x42\x94\x3B\x96\x0B\x94\xDD\x90\x30\x94\x2F\x27\xC2\x35\xA1\x74\x91\xAF\x85\xD4\x8C\x0F\x95\x60\x5D\x18\x92\x53\xF8\x73\x4D\xB8\x9F\x89\x6E\x88\x8F\x80\xE2\x90\x73\x87\xBB\x93\x49\x1F\xF9\x4E\x8B\x7D\x9B\x3C\x97\xA7\x89\x88\x67\x87\x90\x00\x8B\xD3\xC5\x61\x0A\x83\x58\x9F\xFC\x8C\x99\x7E\x22\x78\x32\x01\x76\x8B\x05\xED\x16\x1D\x25\x4C\x2D\xA0\x8B\x49\x92\x66\x2A\x08\x8A\xFF\x7F\xCA\x00\x11\xCD\x5E\x03\x1B\xFE\x81\x8C\x92\x89\x5B\x30\x95\xA4\x31\xC5\x28\xD4\xBD\x2F\x24\x0B\x46\x9E\xCE\x44\x17\x2E\x9B\x92\x56\x37\x06\x26\x81\xA3\x51\x9A\x69\x06\x0C\x8C\x97\x36\x92\x30\x94\xA4\x31\x25\x08\x5C\x02\x4A\x22\x4F\x49\x0C\x8D\x95\x1A\x94\x36\x19\x6B\x94\x3E\x6F\x59\x51\x80\x00\x05\x47\x94\x73\x53\x68\x35\xBA\x69\xA3\x31\x6D\x56\x44\x51\x93\xB9\x23\x47\x93\xBD\x8F\x7B\x46\x02\x46\x74\x94\x06\x0D\x5F\x4C\x82\x04\x09\x46\x9C\x51\x3E\x1D\x95\xCC\x73\xED\x03\xF1\x28\xD0\x51\xB3\xA3\x92\x99\x2F\x92\x06\x99\x89\x2B\x46\x45\x44\xF8\x28\xF5\xCE\x6C\xEF\x54\x31\x44\x86\x01\xA3\x92\x3D\x58\x5F\x94\xC0\x28\xDE\x51\x8E\xA3\x80\x47\x9A\xB4\x8B\xD9\x2E\x34\x19\x63\x94\xE3\xF9\x09\x02\x3C\xA3\x94\x39\x54\x8D\x96\xD0\x89\x38\x82\x00\x7C\xCF\x28\xE1\x51\x91\xA3\x8A\x60\x43\x8D\x95\x3B\x54\x42\x94\x5D\x92\x07\x25\xE7\x4C\x89\x04\x0C\x47\x92\x16\x6C\x25\x95\xF3\x8E\x39\x8B\x13\x29\x81\x52\xA2\xA4\x83\x48\x92\x8D\x97\x24\x02\x4B\x95\xEE\x58\x27\x29\xC6\x49\xA9\xA4\x89\x9A\x36\x93\x91\xD2\x72\x3F\x95\x90\x32\xF0\x28\xB3\x11\x36\x27\x02\x47\x94\x90\x95\x1E\x95\x60\x47\x9C\x94\x53\x19\xD5\xDE\x1B\x98\x86\x4F\x60\xF7\x03\x23\x96\x58\x69\x9F\x94\x20\x65\x41\x52\xB8\x21\x03\x4A\x93\x92\x92\x1A\x19\x41\x95\x5D\x3E\x48\x29\x92\x39\x8A\xA5\x9B\x31\x93\x40\x92\x89\x92\x29\x41\x65\x00\x11\x29\xBC\x8C\x7D\x1F\x5D\xB7\x8A\xF6\x12\xE9\x70\x33\x01\x48\x73\xBC\x8F\x69\xA5\x51\x8D\x31\x75\x04\x03\x81\x83\x72\x48\x2D\x97\x04\xA3\xEE\x4E\x3F\x99\x8E\x60\xB6\x2D\x4A\x92\x1A\x2C\x47\x00\xB2\x87\x90\xDC\x23\x22\xA9\xE1\x70\x09\x7A\x97\x91\x20\x02\x8A\x47\x84\x73\x16\x65\x43\xD7\x2E\xF7\x54\x31\x7C\xF3\x05\xA6\x22\x43\x92\xEB\x88\x85\x29\xC9\x84\x12\xC2\x7D\x4B\x9D\x51\x89\x7A\x7B\x68\x6F\x19\x59\x63\x22\x9E\xC2\x62\x57\x57\xF1\x51\x96\x95\x52\x8D\x71\x8B\xE8\x18\xA1\x1C\x3D\x40\x95\xC3\x67\xFF\x61\x52\x1D\x32\x95\x20\x69\x47\x55\x44\x57\x16\xA8\x36\x89\x9C\x23\x95\x53\x24\x9C\x92\x43\x8C\x33\x48\x3B\x74\x27\xED\x26\x2E\x0D\xA1\x2A\x99\x92\xC3\x47\x75\x38\x8E\x62\xD7\x65\x7D\x8A\x5B\x51\x27\x40\x4B\x36\x16\x00\x4D\x33\x06\x66\x18\x2C\xEB\x0C\x53\xAE\xF7\x51\x4D\x9C\x63\x63\x36\x95\x53\x04\x09\x44\xB6\x29\xB3\x09\x0A\x5C\x25\x46\x8B\x99\x95\x71\x33\x74\x4B\xDD\x94\x43\xBD\x14\x18\x3A\x0C\x3B\x88\x0E\x9A\x1F\x93\x29\x9D\x0C\x20\x8E\xCE\x54\x23\x53\x8D", "\x3B\x84\x3C\x3A\x4D\x94\x18\x5B\x42\x8C\x83\x00\xD5\x29\xC6\x21\x87\xA7\x96\xE9\x3D\x15\x5C\x35\x1C\x73\x94\xC6\x2B\x80\x17\x50\x53\xA5\x5E\x31\x2F\x9B\xB4\x8B\x3B\x94\x1C\x36\xED\x38\x5F\x09\x2C\x73\x1B\x92\x3F\xBD\x21\xBB\x22\x83\x06\x78\x94\xD6\x25\xAD\x29\xD6\x19\x84\x9E\x30\x26\x96\x9D\x91\x31\x95\x99\x71\xC5\x94\xD7\x11\x93\x2F\x80\xAB\x28\x4F\x9B\xA8\x02\x3D\x97\x2C\x02\xAD\x21\xED\x29\xE1\x53\x90\x83\x9B\x1F\x00\x9F\x91\x32\x97\x63\x8E\x19\x7E\x64\x08\x76\xA3\x48\xC6\x6C\x4C\x93\x1E\x68\x31\x97\x34\x7E\x4F\x72\xA5\x1F\xA4\xFA\x0C\xA6\x89\x8E\x64\xF0\x7D\x69\x6B\xE6\x25\xD4\x8F\x66\x16\xD1\x18\x10\x3E\x72\xAD\x28\x78\x77\xB2\x93\x75\x95\x81\x00\xC4\x24\x8E\x54\xA7\x64\x89\x08\x08\x4B\x97\x34\x95\x25\x13\x08\x95\x0B\x12\xF9\x53\x81\x04\x0D\x8D\x68\xA1\x90\x84\x7B\x1D\x2C\xC4\x73\xC3\x25\xB1\xC2\x5B\x42\x13\xAE\x4B\x0D\x00\x45\x94\x64\x8F\x4D\x08\x3C\x06\x5C\x01\x36\xA8\x95\x40\x4F\xA1\x92\x20\x03\x2A\x92\x13\x95\x5B\x25\x70\xC2\x4A\xBF\x2C\x7E\x36\xB4\x84\x4B\x06\x8A\x93\xBA\x7A\x6A\xE0\x22\x4B\x88\x17\x03\x8C\x7C\xF1\x7D\x30\x7A\x19\x71\x8F\x1B\xFC\x29\x82\x17\x3C\xC5\x63\x5A\x55\x5C\x26\xFC\x32\x5E\x78\xCE\x53\x74\xF1\x69\x99\x25\x26\x09\x7F\x30\x7A\x18\x28\x14\xFB\x37\x84\x00\xEE\x6F\x50\xF7\x46\x04\x07\x52\x9A\x57\x79\x49\x95\x8A\x94\xC6\x8D\xA1\x1B\xD2\x4A\xB1\xB5\x2E\x48\x98\x93\x96\x63\x47\x8C\x86\xB1\x93\x25\x27\xD6\x4F\x85\x9E\x9F\x44\x89\x7D\x94\x23\x90\x22\x94\x8F\x90\x8A\x28\xCF\x42\x80\x9C\x8A\xCA\x84\x2F\x86\xC4\x8C\x2A\x8B\xCD\x8D\xA1\x26\x88\x4D\x92\x80\x8A\x34\x95\xDC\x89\x4D\x94\x7F\x56\x36\x95\xFC\xB1\x19\x12\x7A\x35\x97\x7A\x8B\x22\x97\x2A\x91\x08\x92\x6D\x91\xE9\x26\x8B\x42\xAA\x9D\x9E\x09\x9C\x76\x97\xC5\x75\xA7\x92\x9D\x80\x9A\x1B\xFD\x40\xB4\xF1\x62\x35\x98\x02\x97\x49\x91\x96\x47\xEB\x8E\x2E\x0D\x83\x02\x08\xAA\x9B\x90\x5A\xA8\x91\xA6\x85\x9A\x86\xF2\x91\xD9\x20\xE6\x47\xB7\x7B\x80\xF6\x8B\xC8\x89\x82\x91\x9C\x91\xA7\x80\x28\xEB\x64\x3B\xB8\x48\x99\x35\x91\xBC\x8B\xA2\x6F\xA1\x94\x93\x94\x6E\x2A\xD8\x1C\x80\x13\x8D\x54\x9B\x19\x97\xDC\x93\x06\x91\x48\x95\x3C\x21\x93\x55\x9D\x85\x95\x54\x9F\x15\x95\x02\x96\xB2\x92\xFC\x8E\xCB\x14\xDF\xEC\x4D\x53\x8E\x98\x43\xAA\x94\xA7\x45\xA9\x94\xE4\x86\x7D\x0E\xAD\x51\xBB\x9F\x8D\x35\x9D\x7F\x93\xE2\x93\xFF\x93\x8A\x93\x01\x28\x97\x4E\x8B\x7C\x9E\x8C\x47\x28\x93\x7E\x93\x49\x01\x66\x95\xCE\xAF\x4F\x55\x8F\x38\x82\x3C\x9E\x82\x94\xDA\x91\x9F\x91\x30\x85\x7F\x22\x99\x30\x81\x8A\x84\xA6\x83\x2A\x95\x2F\x8D\x77\x91\xEA\x53\x83\xF6\x6F\x40\x85\x24\x8C\x4E\x30\xAE\x91\x79\x5A\xB8\x95\x10\x87\x40\x0F\xEF\x1E\xBC\xAA\x80\x0E\x9F\xA8\x90\x66\x93\xB6\x90\x99\x91\xA5\x23\xB4\x46\xA7\x8E\x97\xDC\x85\xE2\x88\x7F\x8D\xA6\x95\x25\x91\x05\x27\xF2\x16\x1D\x66\x80\x04\x9C\xE2\x89\x9E\x7D\xBD\x95\x0F\x5D\xF7\x2A\xEF\x54\xA4\xAB\x91\x53\x98\xAA\x91\x1D\x92\xAA\x95\x82\x8F\xAC\x2A\xEF\x44\x82\x7B\x99\x1E\x93\x70\x96\x00\x84\x0B\x6B\x47\x94\x80\x06\x9F\x4E\x93\xA2\x9C\x52\x0F\xB0\x90\x4B\x5D\xC4\x94\x5D\x95\x8B\x06\xE4\x4E\x80\x89\x86\x3B\x98\x25\x90\xED\x90\x8C\x90\x61\x95\xA1\x21\xC4\x55\xA3\x86\x9E\x0F\x8F\x2C\x92\xE6\x90\x2A\x89\x54\x90\xA9\x28\xA2\x55\xB8\xAA\x80\x5F\x48\xAF\x92\xDA\x91\xB9\x95\xE2\x93\x73\x2A\x9D\x3C\xB5\xA9\x9D\x0B\x97\xA7\x97\x2F\x93\xB6\x93\x0E\x8C\xDD\x26\xCC\x33\xA2\x8B\x91\x71\x04\x2E\x95\x82\x90\x57\x85\xD1\x8B\xF2\x0D\x9C\x12\xB4\xAB\x9B\x59\x9E\xC8\x41\x5D\x87\xCF\x95\x41\x94\xB4\x27\xB3\x3E\x97\x9B\x95\xF9\x8B\xAE\x93\xFD\x8B\xD1\x94\xE5\x8C\x49\x2B\xDC\xC4\x7E\x70\x99\x3A\x93\xA0\x90\x6A\x97\x02\x89\x05\x87\x79\x0E\x80\x00\x25\xAC\x89\xE3\x57\xB2\x90\xCD\x87\x9C\x84\x39\x95\x84\x28\xF4\x54\x86\xA2\x88\x3C\x95\xB4\x94\x6C\x91\x9E\x95\x8B\x91\x25\x28\xAD\x86\x6F\x67\x80\x1F\x85\xE6\x63\x6D\x94\x31\x61\xB6\x95\x7C\x0E\xF0\x06\x8D\x23\x95\x3C\x98\x12\x96\xFF\x91\xEA\x92\x24\x90\xCF\x1E\xF9\x40\x9D\x81\x9B\xE2\x83\xE9\x8A\x32\x56\xDF\x94\xA2\x94\x3C\x2B\x92\x56\x94\x9F\x97\x5A\x90\xB7\x91\x6B\x96\x75\x91\x74\x95\x63\x0A\xDD\x56\xB7\x5F\x9F\x5A\x9C\x9E\x89\x6C\x96\x14\x4C\x81\x90\xB7\x2A\xE6\x51\x93\x1E\x93\x76\x85\x6F\x94\x72\x95\xC5\x95\x80\x91\xEA\x20\xF3\x56\x89\x9F\x99\x36\x90\xF7\x8C\x73\x95\x92\x8F\x77\x95\x2C\xE3\x3A\x50\x99\x29\x88\x7A\x07", "\x4E\x6F\x32\x92\x4D\x58\xAA\x95\x1E\x8D\x26\x55\xAF\xAD\x87\x5D\x98\x6F\x92\x60\x91\xCA\x92\x82\x91\x21\x28\xB3\x41\xA3\xA0\x85\x1C\x93\xE6\x82\x24\x90\xD5\x63\xC7\x95\x55\x29\xEF\x19\x67\x3B\x98\x42\x92\x3D\x95\x01\x96\xE4\x90\x39\x94\xC4\x23\xBB\x48\x85\x8D\x89\x42\x9F\x3F\x91\xFE\x90\xD8\x7A\xB3\x8A\x0F\xB9\x48\x57\xB4\xA4\x95\x5A\x9B\xA8\x94\x81\x82\xCA\x94\x73\x93\x2C\x2B\xE8\x4D\xAE\xAC\x84\x12\x90\xB3\x92\x46\x92\xCC\x95\x33\x8E\x9D\x1C\xB3\x34\xAB\x1C\x9B\x5A\x7A\xBD\x96\xB8\x40\xE0\x94\x46\x87\x82\x28\x95\x57\xA7\xAB\x9C\x72\x88\xB9\x96\xCB\x86\xE6\x95\x0D\x8C\xAE\x2B\xB9\x3E\xB0\xAE\x93\x0B\x95\x79\x78\x0C\x6E\xA1\x7B\xF6\x95\x7A\x8C\x6F\x57\xA4\xAE\x84\x39\x9E\xE8\x82\x7E\x94\x0C\x94\x74\x95\x32\x28\x80\x45\xB4\xA0\x82\x14\x99\xBF\x92\xEE\x8F\xFE\x95\x13\x88\xF2\x27\xF5\xF6\x0A\x8E\x98\xBA\x56\x72\x78\x80\x97\x41\x95\x5C\x95\x6E\x2B\xCD\x1A\x80\xAD\x91\x5B\x92\xB4\x92\x75\x96\xF6\x93\xBA\x95\x8A\x27\xF7\x56\xA6\x8D\x8F\x60\x98\xF4\x74\x98\x8F\x75\x7E\x0B\x96\x84\x97\x02\x58\xB9\x3B\x83\x37\x94\xB1\x93\x81\x90\x1D\x90\xBF\x8F\xFA\x26\xE8\x3D\xAB\x9C\x82\x5E\x9B\x78\x96\x64\x91\xDE\x94\xDE\x8D\x16\x28\xA4\x09\x87\xAF\x98\x5D\x9A\xBC\x96\x6A\x95\x0B\x97\xC1\x95\xA6\x27\xC9\x13\x83\x9B\x91\x4F\x85\x6C\x90\x82\x93\xB1\x92\xA8\x7C\x2C\x1F\x86\x04\x84\x3D\x18\xC5\x65\x39\x70\x85\x96\x13\x4E\x15\x96\x26\x0F\xAC\x58\x85\xB0\x9C\x5D\x97\x7D\x97\x6F\x93\xEF\x95\xC0\x91\x33\x2C\x83\x47\x83\xAF\x8E\x39\x99\xEF\x68\x26\x91\xFD\x70\x1E\x94\xDA\x0D\xBA\x56\xA2\xAE\x8A\x3D\x8F\x66\x84\xD6\x7C\xEE\x80\x4C\x94\xA0\x0E\xCE\x57\xB2\x8E\x9C\x44\x96\x3D\x96\x13\x96\xED\x90\xA3\x8A\x62\x18\xE4\xF2\x4D\xA1\x8A\x10\x97\x68\x8E\x9F\x8C\x16\x8D\x1E\x8F\xBB\x21\xB9\x56\x82\x04\x0E\x62\x96\x91\x95\x87\x95\xF7\x94\x89\x87\xE6\x2A\x87\x58\xB4\xAF\x89\x60\x9A\xAE\x93\x81\x94\xBB\x95\x06\x96\x71\x21\xA4\x58\xBE\xAA\x75\x0D\x9D\x95\x90\xE4\x87\x19\x94\x34\x8C\xF0\x23\x8F\x38\xB2\x8F\x92\x67\x7F\xAD\x94\x87\x94\x2F\x2C\xFB\x86\x71\xC7\x41\x56\x89\x85\x83\x5A\x92\x36\x90\x84\x94\xF7\x93\x76\x95\xFF\x26\x8D\x4F\x8F\x14\x83\x45\x97\x1A\x84\xEC\x8D\xAC\x6C\x3F\x94\x94\x2C\xB7\x57\xA3\xB1\x8C\x41\x80\x65\x96\x8C\x97\x53\x82\x34\x96\xC4\x20\xEA\x58\x94\x8F\x8C\x63\x9B\x3F\x92\x7A\x96\xF1\x91\x81\x95\xC8\x23\x9A\xDA\x64\xB2\x95\xF3\x88\xBA\x60\x30\x7C\xD2\x93\x06\x84\xFA\x29\xF6\xE0\x64\xAC\x96\x64\x98\x0D\x18\x93\x95\x1F\x66\xCB\x95\x9E\x22\xF5\x57\x80\x3C\x97\x5F\x9A\x9E\x88\x91\x95\x60\x90\x45\x96\x12\xDF\x14\x48\x85\x9D\x85\xD6\x84\xA8\x80\x15\x95\x49\x4F\x61\x96\xAB\x2C\xF7\x0F\x98\x98\x8C\x3D\x87\x9D\x85\xDC\x93\x21\x90\x5F\x95\x89\x20\xC0\x55\x9B\x85\x85\x5F\x96\x24\x97\x7C\x95\xD8\x86\xEB\x95\xA0\x18\xAA\x48\x8B\x3E\x68\x22\x9E\xF7\x81\x31\x7E\x88\x91\xC0\x87\x24\x22\x8F\x52\xA6\x88\x99\x46\x6A\xC7\x92\x1B\x97\xE3\x5B\x4A\x92\x26\x2B\x98\x58\x81\xAE\x82\x21\x8A\x7F\x97\x38\x85\xB0\x92\x21\x96\xA8\x27\xC4\x58\xAA\x9E\x86\x62\x9C\x7A\x90\x12\x7C\x9F\x94\xCC\x87\x06\x2B\xF0\x3C\x9B\x3E\x9A\xC9\x8C\x21\x8C\x27\x8F\xAA\x90\xD1\x76\xF1\x26\xEC\xB1\x5C\x29\x17\x49\x95\xDF\x87\x24\x00\x3E\x96\xB6\x95\xFA\x2C\xF0\x57\xB9\x9F\x92\x56\x9E\xCF\x94\xFF\x90\x40\x96\xC3\x95\x02\x2D\x88\x57\xAB\x9E\x8A\x5C\x96\xD1\x65\x46\x92\xFC\x5F\xD6\x8D\xD4\x1D\xB0\x4E\x90\x89\x88\x6A\x83\xF5\x83\x1D\x94\x88\x87\x8B\x96\x7F\x2B\x99\x5A\x83\xB0\x90\x53\x93\xC5\x96\x85\x95\xF9\x90\x18\x96\x57\x2C\xFB\x4D\x9B\x9F\x84\x19\x95\xC3\x94\x04\x96\x28\x96\x52\x93\xA7\x0F\xBB\x40\xA2\x89\x92\x4E\x94\x26\x95\xFD\x78\x45\x96\x22\x87\xCD\x8A\x76\x51\xB9\xAE\x90\x56\x92\xB8\x95\x9F\x96\xCE\x93\x7F\x96\xEF\x09\xC3\x58\x8D\x75\x85\x62\x95\x75\x90\x31\x8D\x18\x95\x0B\x8F\x49\xAE\x4E\x40\x89\xAB\x8B\xE5\x7B\xAC\x92\x21\x4F\x51\x97\x4E\x87\x49\x2D\xC7\x52\xB2\xB4\x8B\x61\x95\xBA\x97\x87\x96\x53\x97\xF6\x84\x50\x2D\xBC\x4E\x92\xB5\x95\x15\x94\xD5\x94\x0B\x90\xB2\x93\xCC\x91\x99\x16\x9C\x8A\x7B\xD0\x2C\x48\x4F\x68\x2D\x7D\x74\xF5\x40\x62\x5B\x5F\x2D\xB0\x1D\xA1\xB5\x98\xD2\x40\xC5\x97\xE7\x86\xCF\x94\xB3\x96\x1C\x2D\xCF\x5A\x9E\xB4\x91\x6A\x91\xD0\x93\xAA\x97\x40\x97\xAA\x96\xA8\x1C\xD7\x5A\x89\x9B\x9F\xA6\x89\x8C\x78\x88\x6D\x5E\x96\x73\x87\x7B\x2D\xED\x54\x91\xAE\x88\x59\x94\xD6\x86\x9B\x97", "\x41\x90\x70\x96\x09\x21\xE2\x59\x84\x87\x94\x43\x96\x1C\x96\x0E\x96\xFD\x8D\x82\x95\x23\x20\x87\x56\x8B\xB4\x9B\xCC\x84\x33\x4F\xE0\x90\xB8\x8F\x84\x93\xC1\x2C\xA8\x03\x93\xB4\x8F\x69\x94\xCC\x93\x74\x94\x59\x96\x02\x96\x2F\x08\x9B\x58\x88\xB3\x95\x34\x9A\xCC\x90\x3D\x8C\x33\x97\x9B\x8F\xCE\x2C\xDC\x43\x9E\xAE\x99\x90\x8E\xB1\x94\x1B\x7D\xD9\x95\x20\x8E\x33\x09\xF1\xF9\x4F\xB6\x9B\xC3\x7A\xCB\x45\xB5\x94\x19\x96\x92\x92\x1C\x05\xCC\x14\xBB\xAB\x98\x16\x9D\xAF\x94\x08\x94\xBC\x90\x23\x94\x11\x28\xDF\x50\x94\xAF\x94\x40\x98\xD5\x83\x70\x7A\x07\x8E\xAE\x93\x84\x12\xFC\x9F\x58\x5D\x42\x08\x03\xDC\x92\x27\x7D\x71\x97\x6C\x96\xC6\x2C\xD9\xC3\x56\x89\x81\x5F\x9F\xAB\x93\x7C\x96\x96\x90\x72\x96\x5C\x22\xB7\x50\x9F\x74\x81\x70\x88\x0B\x96\xCB\x8D\xD1\x93\x06\x8E\x91\x2C\xC3\x3E\xA8\x8B\x81\x01\x6B\xDA\x97\x9E\x96\x71\x96\x56\x96\x45\x26\xEE\x1E\x9D\xB3\x9F\x5E\x9F\xCD\x94\xBC\x95\x38\x96\xF3\x96\x24\x24\xE8\x5B\xA6\x90\x8A\x6F\x9E\x25\x92\x55\x6C\xD6\x93\x39\x8F\xCF\x19\x93\x49\x59\x54\x94\xC7\x76\x27\x88\xCF\x8D\x71\x87\x9E\x94\xF6\x2D\xE0\x5B\x8B\xAF\x8E\x43\x97\x3F\x92\x96\x95\xFE\x90\x5A\x96\x3A\x24\x81\x56\xBC\x90\x98\x65\x9E\x43\x96\xED\x93\xC2\x90\xAF\x96\xAC\x2D\x92\x5C\xBE\xB0\x95\x69\x90\xC4\x94\x81\x90\x2C\x94\xCC\x93\x7E\x1A\xBA\x34\x90\x75\x93\x65\x7E\x77\x96\x6D\x75\x7D\x97\x83\x62\x30\x2D\x90\x57\x9C\xAF\x9A\x5D\x9A\xC1\x90\x6B\x97\xFC\x95\x8A\x87\x5B\x2B\xEE\x3E\xAC\xAE\x99\x3D\x90\xCA\x93\xF7\x93\x4F\x97\x89\x7C\x41\x0E\xA5\xFA\x6E\xB4\x91\x70\x9A\xD4\x96\x8F\x94\x8D\x97\x60\x87\x2F\x28\xE3\x5B\xBA\x74\x92\xE7\x80\xE0\x92\xDD\x92\x80\x96\x76\x93\xE6\x2C\xEE\x4D\xA8\xB3\x95\x77\x79\x33\x96\x61\x49\x77\x96\xAC\x91\xDF\x2D\xC5\x5C\x97\xB2\x93\x70\x90\xCB\x95\x58\x92\x85\x97\x2D\x94\xCF\x2D\xDD\x50\x91\xB7\x9F\x44\x93\xDD\x95\x3A\x82\xF1\x95\x67\x85\xDC\x2D\xA1\x5C\x9A\xB9\x85\x66\x9C\xE5\x95\x65\x91\x26\x94\x77\x91\xCE\x2D\xB1\x46\x90\xB7\x96\x65\x9D\x3F\x95\xCC\x95\x28\x95\x8D\x8F\x88\x23\x8B\xA9\x5A\x8D\x92\x21\x90\xE1\x90\xC6\x97\x7D\x96\x6D\x96\xE4\x25\xC9\x5B\xA7\xB1\x8E\x73\x99\xC6\x92\x13\x96\xFA\x92\x0C\x97\xEC\x27\xF4\x5C\xAE\x9F\x91\x72\x90\x7F\x91\x7D\x96\x50\x91\xF5\x95\x95\xE3\x57\x5C\xA8\xA0\x8E\x5C\x4F\xE7\x91\xBC\x95\x27\x84\x4D\x96\x28\x27\x9C\x59\xA0\xA0\x9B\x69\x9D\x6F\x95\xC7\x95\xF3\x93\x1F\x97\x40\x01\xE2\x4F\xAD\xB4\x92\x74\x9C\xB3\x61\x20\x01\x8C\x97\xE4\x95\x5B\x2E\xA3\x5C\xB1\xB6\x96\x71\x92\xC8\x90\xC7\x95\x6D\x96\xEC\x90\xB7\x2D\xEF\x42\xB9\xB6\x84\x14\x90\xCD\x92\xDD\x82\x17\x96\x50\x76\xF4\x27\xFD\x08\x83\xE8\x44\x75\x91\x83\x65\x9D\x47\x9A\x96\xD7\x96\x51\x2C\xE5\x5A\xA4\xB8\x87\x6B\x90\x75\x91\xAD\x96\xD4\x93\xB5\x96\x3E\x27\xE9\x47\x87\xB1\x92\x20\x9D\x93\x8D\x00\x95\xEE\x7A\xAA\x63\xBC\x2E\xCC\x90\x5B\x34\x52\x6C\x93\xE3\x94\xA9\x94\x3F\x97\xC0\x96\x68\x2D\x83\x5B\xAA\xB5\x85\x6C\x9C\xD6\x97\xB0\x96\x5B\x97\x19\x8C\x60\x1A\xD2\x39\x87\x2A\x8B\x49\x9A\xE6\x92\xAC\x97\x64\x97\x0C\x96\x48\x2E\x81\x59\x8A\xB9\x8F\x4A\x8F\xEA\x90\x54\x91\xAC\x96\xED\x90\xB3\x2E\xA4\x45\xB5\xBA\x87\x1C\x92\xBB\x94\x8C\x5A\x0A\x94\x9E\x87\x69\x2E\xC4\x5C\xA6\xBB\x95\x76\x93\xAE\x93\x72\x94\x60\x97\x90\x84\xCB\x0D\x8E\x1B\x8D\x90\x89\x00\x93\x8B\x93\xC5\x97\x4B\x90\xDF\x93\xCE\xD8\x5C\x36\x66\x97\x31\x76\x93\x8A\x66\xA2\x95\xA5\x97\x36\x97\x13\x22\xEF\x5C\xAF\x8C\x91\x73\x9F\xAF\x93\xCE\x96\x86\x97\xE9\x95\x1C\x2E\xCA\x50\x89\x87\x8C\x64\x95\x86\x92\x22\x94\x00\x7D\x71\x82\xBF\x2C\xEA\xB1\x69\xB6\x9B\x6E\x96\xCF\x96\xCF\x96\x88\x97\x3F\x96\xBB\x2A\x96\x5B\xAC\x88\x98\x6C\x9D\x19\x95\xC9\x96\xA4\x95\x1A\x94\x1D\x1D\x84\x5C\xA8\x90\x9A\x65\x9C\xF1\x96\xE7\x8E\x19\x94\x4A\x7F\x69\xF9\x2E\x26\x9B\x8F\x64\x79\x93\xE4\x96\xE4\x97\xAF\x97\xE3\x96\x4E\x25\xF9\x0F\xBB\xB7\x89\x72\x9A\x67\x93\xC9\x95\x46\x8F\x19\x94\x1B\x1D\xB0\x5E\xBF\x74\x9B\x34\x91\xD4\x8C\xE6\x96\x3A\x97\x8E\x97\x21\x00\xAA\xFD\x46\x90\x81\x79\x98\x40\x95\x5C\x87\x40\x00\x86\x97\xF4\xC1\x0E\x5E\xA7\xBC\x87\x72\x9B\xD7\x83\xB9\x94\x08\x92\x96\x97\x2E\x22\xAE\x5E\x81\xAB\x8A\x7A\x90\x68\x92\xE6\x94\x3E\x8E\x04\x91\xE1\x15\xCE\x50\xAE\x66\x94\xE9\x81\x2D\x93\x83\x90\x0A\x85\x3E\x97\x79\x0D\xBE\x5D\xBB\xBB\x8B\x6A\x9D\xEF\x95\x05\x97\xBF\x97\xA6\x84", "\xEB\x2E\xFE\x1D\xAD\xBB\x97\x34\x9F\xEE\x92\x54\x91\xBC\x96\x77\x95\xBB\x2D\xF4\x3E\xBB\xB2\x84\xAE\x84\xCD\x95\xC7\x8E\x35\x97\x7F\x67\x2F\x2E\xF1\x5E\x82\x04\x07\x75\x9B\xBD\x94\xEE\x95\xCF\x94\x29\x96\xAB\x2E\x86\x58\xB9\xBD\x91\x41\x9C\xE4\x90\xE9\x95\x4F\x8E\xB2\x97\x6B\x27\xE6\x5E\xAD\x9D\x99\x41\x90\x44\x94\x07\x84\x55\x8E\xD0\x8F\x5D\x13\xFC\x15\x84\xBA\x35\xEA\x89\xBF\x78\x47\x96\x68\x0F\x1D\x95\x07\x2A\x83\xED\x75\x14\x31\x4B\x9D\xD7\x3A\xA9\x3E\x6F\x68\xD4\x97\x9A\xC2\x31\x3B\xB3\xAB\x9C\x52\x07\x98\x92\xF1\x95\xDD\x97\x4B\x94\x84\x2E\xB1\x59\x86\xBA\x8E\x40\x98\xE8\x90\x02\x96\xA2\x96\x24\x94\x19\x2F\x95\x2E\x89\x89\x97\xE9\x70\xA8\x96\x04\x93\x50\x87\x44\x93\x2B\x1E\x94\x40\xBF\xA1\x8A\xF4\x5E\xF3\x85\xBB\x86\x88\x86\x7D\x95\x2A\x2F\x8E\x55\xA0\xBD\x82\x21\x92\xF6\x93\x9C\x94\xE6\x96\x4A\x95\x9A\x2F\x96\x55\xA0\xB6\x9E\x34\x92\xDA\x92\x7F\x8C\x43\x96\x4E\x95\x4E\x22\xB8\x58\xA5\x9A\x8C\x69\x9C\x12\x65\xF6\x96\x62\x86\x55\x97\xF4\x06\xD1\x5F\xBD\xAA\x9E\x6F\x99\xD9\x95\xFA\x97\x66\x97\x27\x97\x75\x28\x8C\x5D\xB7\xA1\x95\x6E\x9A\x03\x95\xBC\x8F\x56\x86\xA2\x96\xBA\x26\xD4\x8E\x66\xBF\x91\x6D\x88\xFE\x90\xCF\x90\xD1\x97\xB2\x93\x46\x2F\xFC\x4C\x96\xBE\x9E\x33\x97\xFD\x93\x58\x95\xF6\x97\x62\x95\xF4\x2F\xC3\x24\x88\xAB\x8C\x36\x96\x27\x96\xD9\x92\xBC\x93\x81\x00\xFB\x2F\x95\x5A\xBD\xBF\x92\x34\x9A\xD6\x60\xD3\x97\xF1\x92\x0F\x96\x76\x2A\xBB\x5C\x8B\x9F\x9E\x74\x9E\x7D\x97\x86\x95\x9D\x51\x6E\x95\x8D\x26\x86\x02\x11\xC0\x88\x6A\x98\xF2\x91\x65\x97\xFF\x97\x95\x95\x01\x30\xE7\x4E\x83\xC0\x89\x3B\x95\x00\x99\x66\x97\x01\x99\x99\x95\x38\xC9\x47\x1F\x96\x22\x99\x4D\x33\x02\x98\xAC\x95\x09\x99\xCA\x96\xFC\x2D\x97\x5B\xAC\xBF\x8D\x79\x9B\x02\x9F\x65\x95\x0B\x98\xF3\x95\x2F\x30\xB4\x44\x83\xBF\x97\x4A\x88\xB0\x92\x55\x93\xE8\x67\xEA\x87\xA5\x07\xA9\xCF\x35\xC0\x9A\x6B\x97\x03\x99\xE8\x85\xC4\x97\x42\x97\x70\x2E\x9B\x51\xA1\xB9\x9D\x44\x93\xE6\x97\x8D\x94\xDF\x93\x7B\x8A\x4B\x2B\xFD\x16\x3A\x53\x94\xD5\x80\xE6\x8C\xC1\x95\x2F\x90\x90\x93\xB2\xE1\x4C\xD3\x0B\xC1\x90\x6C\x9D\x04\x98\xFA\x95\x0E\x99\x95\x97\x3B\x30\xE1\x5E\xBD\xC0\x84\x5F\x9F\x03\x9D\x9C\x95\x10\x99\x73\x96\xC6\x2A\xE6\xE8\x57\xB7\x8B\x1E\x90\xC2\x8D\x31\x94\xC8\x8C\xDA\x97\xCD\x2F\xED\x1E\x8F\xBF\x83\x7A\x9A\xEE\x95\xE8\x94\xBB\x96\x42\x96\x99\x2B\x86\x59\x9E\xAD\x96\x41\x9C\xF4\x90\x07\x96\xD2\x94\x8D\x93\x16\x15\xDA\x4E\x9E\xC1\x91\x16\x93\xDF\x93\xDC\x96\x08\x99\x3C\x98\x65\x2C\xC2\x5E\x8A\xB7\x8A\x7F\x9C\xAF\x93\xFA\x94\xA4\x94\xF7\x97\xDC\x22\x9C\x5B\x9E\x8B\x9E\x6C\x98\x39\x96\x5E\x92\x01\x84\x7C\x91\xE0\x19\xB1\x07\xBB\x8B\x88\x5B\x96\x72\x7B\x0C\x98\x71\x96\x88\x97\x5E\x2F\x92\x5E\x8D\xB7\x92\x82\x92\xE7\x92\xCC\x97\xEF\x96\xE9\x96\xC1\x2F\xD4\x5B\x9E\x9B\x90\xE2\x8C\xDB\x65\xCC\x66\x29\x98\xEF\x96\xA8\x30\x94\x61\x8C\xB7\x96\x84\x9E\xAF\x92\xB3\x95\x26\x98\xF8\x97\x9D\x2D\xF2\x5F\xA0\x8B\x93\x95\x8F\xE2\x85\x83\x62\x2D\x98\x48\x98\xC8\x2D\xDC\x59\x93\xC2\x87\x83\x92\xFD\x91\x0D\x98\xF5\x97\x35\x98\xE7\x2D\xED\x60\xA9\xB7\x85\x84\x9B\xDE\x95\xFD\x69\x90\x96\x68\x87\xB7\x30\xD8\x5C\xB9\xC2\x8C\x86\x9B\xFE\x91\x05\x99\xCB\x94\x68\x98\x01\x2E\xD2\x61\x83\xB8\x94\x86\x95\xE0\x94\xF3\x95\x04\x97\xF1\x8B\x53\x15\x94\x42\x91\x9F\x99\x86\x93\xE9\x91\x49\x87\x56\x93\x25\x85\x83\x2E\xCF\x60\xBA\xBE\x91\x82\x97\xE8\x93\x0A\x99\x1B\x97\x2A\x98\xD8\x23\xD0\xD8\x61\xE4\x6B\x78\x74\x6C\x5C\x1D\x99\xA9\x97\xC7\x97\xC2\x2E\x91\x5F\x94\xB1\x96\x80\x98\x7D\x90\x03\x98\xD1\x94\x0D\x98\x89\x28\x9C\x60\x8B\xA2\x9E\x80\x9C\xEA\x8A\x4D\x8D\xFD\x71\x3D\x97\x0F\x30\x82\x02\x3E\xC3\x9D\x75\x96\xED\x95\xE8\x81\x89\x97\x17\x96\x92\x1F\x97\x5C\xB6\xC3\x95\x65\x97\xF1\x97\x96\x94\x27\x98\xD4\x91\x70\x2D\xEA\xFB\x67\x2A\x77\xEE\x73\x11\x9A\xDA\x94\xD7\x96\x46\x95\xBA\x30\xDF\x5E\x8E\xC3\x97\x84\x90\x0E\x9E\xC9\x96\x38\x98\x28\x97\x6F\x30\xD2\x5C\x8E\xBA\x9D\x5F\x9E\xA3\x8E\xD0\x79\x49\x99\x86\x97\x13\x30\xAB\x4D\x93\xAB\x91\x38\x95\xAD\x90\xEF\x93\xB5\x94\xBD\x93\xE0\x1D\xF0\x58\xAA\xF6\x72\x08\x9C\xEA\x82\xDE\x8F\xD6\x75\x9B\x98\x59\x2F\xB9\x62\xBF\x9A\x9D\x68\x94\xAD\x97\xA3\x96\xB5\x95\xC3\x95\x2B\x21\x89\x57\x80\x9D\x8B\x5C\x93\xCB\x73\x0B\x8A\x5F\x6A\xC9\x54\x48\x31\xCF\x96", "\x56\xBA\x93\x34\x93\xDB\x95\x10\x95\x8E\x97\xB6\x90\x7D\x2F\x99\x4D\x84\xC2\x9C\x36\x9D\xF4\x91\x06\x98\x61\x90\x71\x97\x0F\x2E\x89\x02\x19\xC5\x94\xAF\x6B\x15\x9D\x02\x98\x07\x97\x4D\x96\x06\x31\x9D\x59\x88\xC4\x98\x53\x9A\x10\x9A\x4F\x94\xA8\x96\x13\x94\x9D\x2F\xB3\x57\x8D\x8E\x2C\x62\x96\x13\x98\x19\x99\xD0\x96\x41\x97\xAF\x2C\xB9\x5F\x9E\xB9\x9B\x7D\x9F\xBC\x95\xF7\x97\x1C\x94\x60\x98\x9B\x30\xC2\x61\x9D\xC2\x9F\x21\x97\x0E\x9F\x2B\x84\x18\x96\x47\x98\x10\x30\xFE\x62\xAF\xC3\x8E\x65\x9F\x7D\x82\x1E\x9B\x60\x98\x7A\x98\xBC\x2F\x9B\x62\x99\xB8\x9A\x84\x96\x3A\x97\x23\x9A\xCD\x91\x25\x94\x46\xC2\x0F\x3A\xAB\x90\x9F\x48\x9E\x44\x07\x7B\x90\x1E\x97\xC1\x5C\x6B\x31\xB1\xA8\x6D\xC5\x98\x9D\x6F\x16\x99\xD3\x95\x5C\x99\x4D\x97\x9E\x2C\xBC\x5A\xA2\xB0\x8C\x3C\x93\xEF\x97\xBD\x88\xFB\x90\x8E\x76\xEE\x23\xB9\x43\x81\xE6\x53\x64\x95\xCF\x90\x00\x01\x6A\x98\x4A\x3E\x65\x30\xFC\x60\xB2\xB6\x97\x71\x9C\xF6\x8F\x2B\x9B\xED\x93\xB9\x98\x46\x2B\xE3\x62\x88\xAD\x85\x8B\x95\xD6\x72\x9A\x94\x17\x98\x53\x8C\xAC\x09\x55\x2B\x9D\x1A\x88\x65\x9D\x1B\x9F\x37\x9A\x44\x40\x74\x97\x5D\x2F\xA9\x62\xAA\xC2\x9C\x85\x94\xF1\x96\x17\x98\xC0\x94\xCE\x98\x02\x2B\x9E\x63\xB9\xB2\x90\x69\x79\xF6\x94\x8E\x96\x4F\x6C\x27\x7C\x54\x2F\x99\x49\x71\xF3\x76\x8E\x91\x51\x43\x9F\x96\x45\x98\x62\x97\x84\x2B\xB3\x45\x88\xBB\x94\x3A\x9F\xED\x94\xD9\x94\x21\x8C\xBE\x7C\x0A\x2E\x8F\xA4\x6D\x90\x91\x6F\x9C\x81\x7F\xF0\x95\x1B\x54\x3C\x98\x55\x0F\x9D\xE0\x59\xC7\x9C\x86\x95\x09\x9B\x25\x99\x2F\x98\x4C\x98\xDF\x31\x88\x63\x9D\xC6\x8A\x8C\x90\x12\x9B\xCA\x96\x2D\x95\xCF\x97\x05\x16\x81\x2C\xAF\xB3\x84\xB0\x81\xCF\x93\xF0\x86\xA1\x95\xD4\x33\x03\x25\xEC\x1E\x91\xC2\x80\x8C\x95\x19\x99\x15\x98\x14\x99\x89\x97\xAC\x30\x95\x5E\xAE\xC2\x9D\x88\x95\xE7\x91\x16\x98\x7D\x63\x21\x98\x99\x14\x86\x4D\x99\x5C\x90\x7C\x87\x21\x9E\xBC\x31\x86\x98\xDB\x97\x00\x31\xB0\x5B\xA9\xBF\x84\x90\x9B\x0B\x9E\x40\x99\x77\x98\x04\x99\x16\x2F\xE0\x63\x9B\xB8\x82\x8F\x90\xC7\x78\x45\x9B\x15\x7F\x25\x74\x29\x17\xC0\x5A\x9F\xAA\x86\x35\x90\xED\x87\x45\x9B\xF9\x97\xE0\x98\xCB\x30\xA7\x60\xA0\xAF\x9E\x86\x92\xBE\x95\x25\x9B\xCB\x96\x06\x96\xCA\x31\xE0\x56\x8C\xC7\x8B\xF2\x86\x6B\x92\x65\x77\xFD\x96\xF2\x94\xBE\x14\xDE\x02\x94\x1D\x66\x92\x9C\xFF\x90\x49\x99\x3C\x98\x0F\x99\xF3\x30\xA0\x64\xB5\xC3\x8D\x85\x94\x05\x9F\x15\x98\x99\x96\x13\x99\x77\x2E\xF6\x3B\x87\xAB\x88\xBA\x8F\x04\x91\x7A\x8D\x47\x68\xA3\x94\x5B\xEB\x5C\x64\x92\xC0\x9E\x92\x91\x18\x9E\x32\x9B\x1B\x95\x2F\x97\x71\x28\x86\x63\x91\xAF\x84\x91\x9B\xE8\x91\x26\x99\xA3\x96\x0F\x97\xDF\x26\x92\x53\x72\xC9\x84\x81\x97\x12\x9E\x7B\x96\x92\x99\xFE\x96\x4C\x32\xE5\x5B\x8E\xC9\x83\x7B\x90\x25\x99\xE6\x94\x39\x99\x99\x97\x66\x31\xEE\x40\xB3\xC0\x82\x52\x33\x28\x9E\x06\x99\xA1\x98\x40\x96\xC3\x31\xAD\x5D\x85\xC7\x9B\x7B\x98\x6D\x91\x2C\x9A\xB6\x93\x28\x99\x9D\x2B\xD5\xD1\x7E\xC8\x9D\x7E\x8D\xDC\x54\x7F\x8C\x71\x8E\xFF\x8D\xF3\x07\x80\x00\x15\xCA\x8C\x82\x97\x29\x99\xE5\x94\x8D\x98\x95\x98\x89\x32\xFF\x5B\x8B\xCA\x96\x7E\x9D\x28\x9B\xE9\x94\x59\x98\x43\x98\x62\x2B\x8C\x25\x9B\x9C\x8A\x84\x95\xFE\x87\x0B\x9B\xC8\x94\xC5\x94\x01\x32\x81\xF9\x49\xC9\x9D\x83\x90\x00\x9F\x0F\x99\xE5\x96\x05\x96\x49\x2F\xB5\x65\xA5\xBD\x8F\x94\x97\xF6\x93\xB1\x95\x6F\x8D\x26\x8F\xA7\x20\xC3\x3E\xB8\xAC\x92\x68\x90\x2C\x9A\x43\x99\x32\x98\xFD\x96\xC3\x32\x99\x65\x93\xBE\x88\x60\x97\x2C\x9D\x90\x95\xB2\x99\x43\x96\xA0\x32\xAF\x57\x81\xBE\x8E\xBB\x89\x9A\x89\x8D\x6B\x48\x75\xDF\x96\xBC\x20\x8C\x61\x83\xE6\x4B\x95\x94\x06\x9D\x55\x9A\x09\x98\x62\x99\x28\x30\xC6\x65\x87\xBD\x88\x96\x97\xF9\x92\x59\x99\xE6\x96\x66\x99\x9B\x2F\x87\x61\xB7\x8B\x88\x80\x89\x2F\x92\x14\x99\x8F\x8E\x07\x97\xDE\x2A\xB3\x7C\x52\xC6\x8D\x41\x8D\x60\x80\xE5\x87\x40\x99\xD6\x98\x17\x30\xC6\x63\x87\xA2\x88\x8E\x96\xB7\x95\x2E\x98\xDE\x95\xBB\x98\x7A\x2B\xB4\x61\xB3\x1A\x97\xEE\x7C\x2E\x9F\x14\x9A\x52\x99\x87\x93\x3B\x31\xAF\x51\xBD\xC4\x91\x45\x9F\x13\x9D\xE0\x96\xD5\x93\xF8\x81\x8D\x2B\x8F\x72\x55\xCC\x98\x85\x97\x31\x99\xE7\x91\xB6\x97\xA6\x98\x84\x2D\xA0\x5A\x86\xB6\x82\x69\x94\xD0\x94\xA4\x96\x4F\x7D\x10\x6F\xC4\xB6\x23\x66\x9A\xC3\x85\x99\x9F\x74\x91\x3E\x98\xC8\x90\xF6\x90\x99\x27\xD9\x55\xB4\xA2\x97\x19", "\x94\xE5\x91\x1D\x9B\xE7\x93\xE0\x93\xD5\x32\xB0\x64\x92\xAE\x96\x7B\x93\xEC\x90\xDB\x95\xB1\x96\x6D\x97\xC7\x2E\xDC\x5D\x89\xBB\x8D\x55\x9B\xEC\x97\xDD\x5B\x99\x96\x43\x7B\x32\x33\xED\x61\xAB\xC6\x82\xA0\x65\xC5\x91\xDF\x91\x4E\x96\x19\x96\xC1\x2B\xDA\x58\xBD\xB4\x84\x5E\x95\x1B\x9C\x8E\x8D\x63\x99\x1F\x68\xC0\x27\xF3\x4C\x82\x04\x11\x9A\x9F\x0F\x9B\x68\x98\xEE\x96\x3B\x99\x15\x2E\x84\x63\xAB\xB1\x9A\x8C\x99\xE8\x94\x4F\x98\xF0\x96\x1E\x99\x1A\x2F\xB3\x62\xA2\xC4\x94\x79\x7C\xE0\x82\x60\x99\xB0\x98\x17\x84\x33\x32\x87\x65\xBA\xC0\x91\x95\x9D\xFE\x93\x56\x9B\xFB\x97\x97\x98\xF1\x2F\xFE\x64\xB3\xBF\x97\x82\x61\xEE\x8B\x41\x85\xE5\x70\xB2\x99\x14\x31\xB7\x5F\xB1\xAF\x87\x98\x9D\x15\x9A\x6E\x96\xC2\x98\xBA\x95\x0C\x33\xA1\x58\x8E\xCC\x83\x61\x93\x2E\x98\x82\x95\xE7\x92\x5D\x8E\xE6\x21\xF6\x66\x96\xCB\x9F\x8B\x9A\x0C\x9F\x4B\x9A\x76\x99\x0F\x99\xAB\x30\xE3\x64\xA2\xC8\x85\x93\x9E\x36\x98\x16\x98\xDC\x99\xEA\x95\x72\x33\xA7\xFC\x75\x85\x95\x9B\x99\x32\x23\x60\x99\x2B\x96\x49\x98\x9E\x33\xAF\x65\x9B\xC7\x96\x91\x91\x22\x9E\x3B\x99\x8E\x98\x05\x99\xE1\x31\x8C\x64\x9F\xC6\x99\x01\x9D\xF0\x8D\x30\x90\x9F\x96\xCD\x99\x42\x33\x94\x5B\x8E\xC1\x80\x93\x97\x19\x9A\x4C\x99\x66\x98\x32\x99\xF7\x30\xE6\x64\x96\xC1\x93\xC3\x8E\xA0\x8A\x77\x91\x53\x7D\xD3\x5B\x0A\x99\x08\x67\xA6\xC4\x95\x88\x9C\xA8\x86\xA6\x95\xAA\x94\x9C\x96\x9A\x2E\xC0\x57\x9C\xBA\x82\x41\x9B\x35\x9C\x8B\x95\x93\x7F\x3C\x97\xFB\xDE\x0F\x63\x8E\x3C\x80\x9E\x97\x24\x9E\x5D\x98\x0E\x98\xBD\x99\x68\x30\xFC\x66\xBC\xC0\x94\x97\x94\x00\x9E\x5E\x98\xF6\x96\x7C\x99\x40\x21\xA0\x63\xBA\x73\x82\x8D\x9D\xC8\x94\x34\x98\x51\x49\x7F\x8E\x07\x24\x85\x21\x8D\x8F\x94\x96\x94\x3E\x9D\x4B\x9A\xF9\x99\xE1\x99\x9F\x33\xE1\x64\xA1\xCE\x87\x9E\x93\x3A\x99\x79\x99\xE9\x99\x33\x99\xA7\x33\xB2\x61\xA4\xC7\x8E\xE8\x83\xC7\x93\x34\x9B\x67\x94\x4B\x8D\x9C\x0A\xE9\x50\xB1\xF3\x72\x9E\x98\x13\x9C\x4E\x99\x87\x99\x00\x9A\xC5\x33\x83\x68\x85\xC6\x8C\x9B\x9E\xFB\x97\x80\x9B\xF2\x99\x22\x8D\x71\x2C\xE5\x65\x82\x90\x90\x7A\x9F\xE9\x62\xEA\x94\xCE\x87\xFC\x99\x48\x0F\x54\x63\xBC\xCF\x8D\x9D\x97\x37\x9D\x60\x99\xF5\x92\xC6\x99\xC4\x31\xD6\x4D\x9C\xCA\x9C\x5A\x92\x08\x9B\x73\x95\xB8\x98\xFD\x95\x95\x33\xF4\x9D\x78\xC7\x89\x23\x5B\x52\x80\x3D\x9A\x0B\x93\x0A\x78\x6E\x2F\xE1\x58\xA3\xCD\x8E\x9D\x99\xDF\x93\x0F\x99\xB6\x98\x56\x97\xDB\x32\x83\x59\x9D\xCB\x81\x84\x9F\x2D\x9B\x10\x9A\xA3\x99\x5B\x99\xD5\x30\xCD\x63\x83\xBE\x8E\x5A\x90\x3F\x8D\x05\x79\x25\x8D\xB4\x87\x49\x05\xC1\x66\xA5\xCF\x94\x9E\x9C\xAB\x86\x7A\x9A\xC5\x94\xEC\x99\xAF\x31\xDA\x67\xB1\xC6\x9D\x74\x9F\xF7\x91\x94\x95\xD7\x98\xBC\x98\x5F\x33\x9A\x3F\xB7\xA2\x9C\xFC\x82\x21\x9E\xF3\x8F\xE8\x96\xD0\x97\x16\x32\x91\x5A\xA1\xC1\x9C\x52\x08\x4F\x93\x73\x9B\x64\x98\xD8\x99\x75\x32\xC4\x67\xB7\xC9\x8A\x9B\x93\xCB\x94\x83\x9B\x61\x98\xC0\x99\xC1\x30\x82\x67\x9F\xB6\x86\x15\x9E\xA7\x91\xE3\x90\xC1\x93\x15\x99\x13\x20\x93\x65\xB1\xB5\x35\xA3\x91\x3C\x98\x3B\x98\x4A\x98\xD9\x99\xA0\x33\xDC\x63\xB5\xCE\x98\x91\x93\x22\x9A\x47\x98\xC6\x97\x04\x9A\x27\x32\x97\x55\x82\x5B\x9D\x7E\x95\x02\x97\xFB\x97\x6D\x83\x51\x93\x50\x19\xB4\x0C\x60\xAA\x89\x8B\x96\x10\x04\x91\x9B\x16\x9A\xC5\x99\x1B\x2D\x80\x5E\xAE\xA2\x82\x78\x97\xE2\x94\xE0\x97\xCF\x92\x01\x94\x41\x27\xCC\x40\x98\x05\x97\x91\x80\x96\x88\x4B\x98\x7A\x8E\x4A\x49\xA6\x34\xFE\x67\x9C\xD1\x92\x69\x80\x43\x9A\x53\x9A\x0C\x9A\x40\x98\xF6\x2B\xB5\x68\xB8\xAF\x97\xA1\x9E\xC0\x91\x87\x98\x32\x8B\x35\x99\xFA\xD9\x34\x1F\xAE\xC9\x88\x7A\x01\x6E\x4F\x21\x5D\x2E\x9B\x39\x99\xFF\x33\xE6\x60\xA8\xCF\x8D\x86\x9A\x3E\x9A\x0D\x98\xFB\x98\x16\x98\xEE\x33\x86\x60\xB0\xCF\x88\x80\x93\x0B\x9F\x50\x36\x85\x48\xC9\x54\xCF\x34\x84\x65\xBB\xD2\x87\x55\x9E\x45\x98\x75\x97\xC5\x94\x7D\x90\x58\x33\xDB\x67\xB4\xB0\x93\x8D\x96\xC3\x90\x62\x9A\xF8\x96\xC6\x96\x2D\x32\xB9\xD3\x21\xD3\x96\x94\x93\x4E\x9B\x77\x95\x39\x9B\xDE\x95\xA9\x2B\x8F\x67\xAB\xAE\x9E\x94\x9D\xBA\x94\x98\x99\x22\x96\x4E\x93\xDB\x2F\x98\x55\x8A\xB4\x9E\x7E\x94\xDA\x94\x32\x67\xC2\x94\xF0\x93\x81\x20\xD2\x56\xB4\xD1\x84\xA2\x9E\x5E\x90\x5B\x99\xEC\x99\x69\x9A\xDD\x30\xF2\x65\x82\xC0\x97\xA6\x9E\x03\x99\x9B\x9A\x0B\x99\x6D\x9A\x30\x30\xB9\x65\xBD\xB6\x8C\xBA\x68\x2E\x9D\x57", "\x92\x98\x8F\x5F\x91\xA9\x2D\xFC\x5B\x73\xD3\x8C\x95\x95\x4F\x9D\xC6\x96\xE4\x96\x3F\x98\x7A\x2F\xC0\x69\x8B\xB3\x82\xA6\x9D\xCC\x96\x9F\x9B\x33\x96\x63\x9A\x4F\x03\xCC\x3C\xAC\xB9\x71\xE7\x73\x52\x9D\x5D\x99\x49\x9B\x74\x97\xDA\x32\xA8\x6A\x94\xBE\x93\x97\x9E\x2D\x9D\x5E\x98\xB8\x99\x27\x9A\xCB\x31\xB8\x65\x8C\xB9\x6D\x6F\x9D\xB4\x97\xBD\x94\x8F\x8E\x14\x9A\x1C\x15\xC9\x60\xA6\x97\x35\xA9\x96\x31\x9E\x82\x9A\x42\x84\xC1\x98\x7B\x34\x98\x63\x9B\xD0\x88\x9E\x9C\x11\x9E\x92\x9A\x47\x98\xDD\x99\xE3\x31\x9A\x6A\x98\x25\x80\x85\x9C\xCB\x96\x5F\x98\x52\x9A\xDB\x8B\xA2\xEE\x0E\x26\x4C\xD5\x84\x99\x9E\x54\x9E\x2F\x84\xF3\x94\x1B\x92\x7C\x34\x9A\x62\x94\xD5\x9B\x8C\x98\x3B\x9B\x47\x98\x56\x9B\x0E\x97\xDD\x34\xC8\x1E\x37\x54\x80\xA7\x9C\x50\x9B\x9B\x96\x43\x9B\x3C\x9A\x18\x34\xD1\x6A\x86\xCF\x93\xAA\x95\x40\x9D\xAA\x99\x5B\x9B\x4B\x9A\x6F\x35\xF1\x66\xB5\x52\x61\x99\x95\xE6\x63\xAC\x9B\xCC\x99\xB2\x9A\xFE\x09\x90\x6A\x85\xC8\x95\xA6\x9F\x0C\x9C\xA2\x98\x1B\x98\x8B\x9A\x40\x30\x98\x6A\xA8\xAF\x85\xD0\x87\x0D\x99\xB3\x87\x40\x00\xC3\x9A\x52\x33\xDB\x61\x8A\xD6\x95\x91\x9C\x58\x9C\x25\x9A\x63\x9B\x68\x98\x90\x35\xEE\x60\x92\xD6\x90\x83\x99\x3C\x95\xF3\x90\x84\x8D\xF2\x8B\x28\x22\x80\x00\x18\xD6\x85\x9B\x92\x3C\x9A\x9A\x98\xBC\x99\x25\x99\x12\x35\xAA\x60\x9F\xD6\x81\x87\x91\x5A\x9B\x1A\x98\x14\x9A\x5F\x4C\x4F\x33\xAC\x82\x6B\xD6\x89\x9C\x91\x23\x9C\xA6\x96\x40\x99\x7B\x9A\x55\x33\xBE\x57\x99\xCF\x98\x62\x99\x35\x98\xD0\x8E\xE9\x99\xC0\x9A\xA8\x33\xA5\x6B\xAF\xB3\x67\xD1\x80\x33\x74\xAE\x99\x0B\x9A\x78\x98\x78\x35\x90\x69\x82\xD0\x92\xA4\x92\x3A\x9E\x76\x99\x25\x9B\xBF\x9A\x57\x35\x82\x69\x8B\xC6\x97\x0F\x8A\xBE\x97\xAD\x89\x61\x9B\xBA\x9A\x81\x2E\x9D\x67\x91\xD7\x9B\xAC\x90\x2B\x99\xB6\x9B\x37\x99\xD9\x9A\x2E\x31\xB5\x6B\xA3\xC3\x97\xAD\x90\x29\x9F\xF9\x47\x12\x88\x5C\x9A\xE0\x35\xF8\x4B\xB8\xD1\x97\xA0\x92\x5D\x99\x83\x98\x75\x9A\x02\x9A\xD6\x35\xA4\x67\x96\xD5\x85\x91\x98\x49\x99\x4D\x99\x43\x99\x24\x96\x7F\xAF\x13\x58\xA2\xD5\x91\xAF\x98\xB7\x60\xBA\x98\x7D\x9A\xF2\x9A\xB3\x33\x9D\x6B\x87\xC8\x9E\x9B\x9F\x0B\x98\x90\x99\x62\x98\xED\x9A\x0D\x32\xA9\x67\x81\x3A\x76\xD2\x86\x72\x7B\xB7\x9B\xF4\x98\x54\x9A\xAC\x28\xAA\x69\x99\xCC\x8C\xA5\x9B\x31\x98\xC5\x96\x73\x8F\x3F\x8D\x1F\x33\xB9\xFC\x7F\x4B\x88\x8B\x9B\xFC\x91\x21\x02\x85\x9B\x0A\x9A\xD1\x34\xC2\x63\x88\xD1\x9A\xA9\x9C\x2D\x9C\xA7\x98\x13\x9A\x9F\x9A\x4E\x34\xB6\x65\x81\xD5\x91\xA2\x90\xEE\x80\x67\x92\xC7\x8E\xE8\x99\xC4\xB6\x27\x6C\x89\xC5\x88\xAC\x9B\xEF\x80\xC1\x99\x24\x9A\xDA\x99\xD5\x35\x94\x69\xBA\xD7\x98\xAE\x9C\x5F\x98\xB9\x9A\x02\x9B\x08\x7F\xE0\x33\x8E\x63\x83\xE6\x5A\xB1\x9A\x15\x9A\xB3\x9B\x6B\x9A\x44\x99\xE6\x35\xCD\x64\xA8\xD7\x8F\x92\x9F\x53\x9A\xC6\x9A\x94\x98\xA1\x9A\x3B\x1F\xB3\x2B\xA4\xA1\x96\x79\x9E\xF1\x95\x34\x99\x14\x95\xD3\x98\x34\x35\x84\x6C\x8A\x2F\x66\xB0\x9F\x54\x98\x6D\x99\x16\x94\x3C\x99\xC2\x23\xD0\x57\x94\x8C\x9C\x9E\x9C\x4E\x9E\xA7\x97\x19\x9A\x51\x94\x35\x2F\xAB\x26\x92\x74\x90\x64\x91\x2D\x9C\x03\x7C\x6F\x99\x15\x9A\x97\x35\xE2\x6C\x83\xD8\x7C\xA5\x90\x5C\x9C\x20\x9A\x15\x97\xE1\x9A\x3A\x2D\xE3\x68\xAC\xD9\x93\x9C\x94\x1B\x98\xA6\x9B\x28\x96\x47\x94\xFF\xF7\x26\x59\xAD\xAF\x6A\xA1\x97\xA4\x6B\xA1\x9B\x73\x9A\xCA\x98\x65\x36\xFA\x68\xA9\xCD\x92\xAA\x9B\x36\x9B\xAD\x99\xDB\x99\xFD\x9A\x7D\x32\xA3\x6B\xB2\xC4\x89\x21\x95\x1E\x9E\x81\x9A\xB2\x84\x1F\x9A\xFC\x31\xAF\x48\x81\xD1\x90\x8C\x92\x10\x04\xC9\x98\x5B\x98\x27\x9B\x39\x35\xC5\x65\xA9\xD4\x8B\xA2\x91\x4C\x9D\x89\x9A\x0D\x9A\xA0\x9A\x57\x36\xB4\x6C\x99\xD9\x83\x7B\x80\x67\x91\x18\x8A\x15\x9A\x63\x8D\x58\x34\xEF\x5E\xA6\xD8\x9A\xB3\x9B\x6E\x7F\x3D\x9A\xD1\x98\x9B\x99\x1E\x28\xB8\x66\xA9\xB8\x9A\x3C\x96\xF0\x93\x3B\x83\xDE\x87\x35\x9A\xE9\xA4\x1D\x3F\x99\x6B\x8F\xA3\x91\x21\x9D\xF2\x66\x22\x9B\xFD\x34\xEE\x24\xF6\x68\x84\xCC\x84\xB3\x96\x56\x9C\xC2\x97\x99\x9B\xB4\x9A\x60\x2E\x96\x6D\x9D\xD0\x98\xB4\x9F\x36\x9E\xC8\x99\x26\x9B\x80\x9A\x9B\x34\x83\x6A\x9D\xD2\x8C\x12\x99\xAF\x75\x43\x88\xA1\x94\xE5\x97\xBF\x33\xBA\x7E\x3C\xDA\x89\xB9\x75\x3D\x9F\x22\x9B\x4D\x97\x8C\x98\xD9\x36\xFD\x6A\xAC\xD5\x8E\xB0\x9B\x20\x98\xC2\x98\xC1\x94\x42\x9A\x09\x2D\xFF\x54\x9A\xAA\x9F\x16\x81\x24\x99\x94\x9B\x63\x3D\x51", "\x9A\x25\x36\xEA\x6D\x8F\xDA\x93\xAF\x91\x69\x99\xAF\x9B\xA4\x9B\xBD\x9A\x95\x36\xF2\x6D\x97\xDA\x84\xB2\x99\x69\x9C\xBD\x99\xB3\x99\x77\x93\x41\x2D\xF6\x5F\xBC\x80\x83\x13\x99\xFF\x95\x72\x71\xB4\x9B\x46\x9A\xEE\x31\xED\x6D\xB0\xC7\x81\x62\x99\x32\x9F\x29\x99\x48\x97\xA8\x98\x23\x2D\xD3\x62\xAF\xB5\x9C\x9D\x92\xFB\x85\xCB\x7A\x32\x9A\x65\x95\xD2\x1B\xEE\x0B\x9B\xAD\x77\xB8\x97\x4A\x9D\xB7\x9B\xC4\x95\xA2\x99\x1A\x36\xCC\x62\xBC\xC4\x8E\x8A\x9E\x13\x98\x2A\x98\x00\x94\xA9\x98\xB0\x34\xD4\x62\x86\x8B\x60\xCC\x80\x8E\x81\x21\x00\xCB\x9A\x5D\x9A\x18\x36\xD1\x55\xB1\xDC\x82\x6C\x98\x32\x9B\xDB\x96\xCA\x99\x6E\x97\x2C\x33\x88\x5B\x8B\x83\x8A\x6C\x90\x71\x9B\x7D\x8F\xB3\x9A\xE6\x34\x3F\x37\xD0\x69\xB7\xD4\x83\x90\x9E\x63\x9B\xBA\x98\x90\x9A\xFC\x9A\x42\x36\x86\x68\x9C\xDB\x87\xAE\x96\x6F\x9B\x3F\x1E\x49\x97\x8E\x95\xFB\x36\xAB\x1B\xBF\x81\x88\xA8\x9D\xB0\x92\xA1\x99\x67\x95\x81\x9B\x1C\x32\x85\x6E\xB5\xD7\x9A\xAB\x9A\x41\x99\xE1\x99\x7E\x9A\xAD\x9B\x0C\x37\xDD\x6D\x9D\xDD\x90\xAB\x9A\x2F\x9B\xA3\x9A\xDF\x81\x8E\x9A\x5B\x27\xF4\x60\xA7\x3F\x93\x42\x96\x5E\x31\xEA\x9A\x38\x9B\xA0\x9B\x4D\x2D\xBF\x6D\x9C\xDC\x86\xBA\x9E\x71\x9B\x65\x98\xC8\x9B\x96\x99\x22\x37\xE0\x5D\x9B\x06\x90\x16\x9F\x51\x9A\x5A\x91\x6A\x96\x20\x6E\x7E\x37\xF4\x69\x80\xDE\x97\x76\x93\x74\x9F\x64\x9B\xCC\x9B\x8E\x9B\x35\x37\x9F\x6E\xB7\xDC\x81\xB9\x99\x73\x9B\xE4\x99\x0F\x8E\x5D\x99\x89\x30\xF8\x6E\x8B\xC2\x8D\xBC\x9D\x08\x9B\x7C\x9A\xC0\x9A\x69\x9B\xAF\x33\xE9\x6E\x95\xDB\x9D\x72\x9C\x76\x9F\xBE\x98\x5F\x9B\xB7\x9B\x7E\x35\xF4\x6D\xB9\xCE\x93\xBB\x92\x58\x9C\xBD\x95\x5D\x66\xAE\x9A\x1D\x27\xDE\x6A\xA9\xC7\x83\xC8\x74\x0A\x9A\x31\x85\xE4\x9A\x92\x9A\x93\x37\xBE\x6D\x95\xDE\x87\x9A\x95\x74\x99\x69\x9B\xD1\x9B\xA5\x99\x1A\x2B\xAE\x55\x9C\xAC\x9A\x67\x3F\x76\x94\x33\x87\xD9\x9A\xD4\x9B\x45\x34\xF9\x55\xAA\xD8\x87\xA9\x9A\x6A\x9B\xA7\x9B\x44\x9B\x9E\x9A\xED\x33\xD5\x6C\x8B\xCB\x8E\xB8\x99\x2F\x98\xFB\x69\x31\x98\xE8\x66\xAC\x33\x85\x8C\x2B\xDB\x88\xC0\x7D\x45\x9E\xDD\x9B\xF5\x98\x78\x9B\x79\x32\xFE\x68\xBB\xC9\x9B\xBA\x98\x40\x9E\xDB\x9A\x7F\x9A\xBA\x49\x95\x35\xA1\x55\x88\x27\x23\xBF\x96\x85\x78\xA7\x9B\x8A\x9B\xEA\x9B\x2D\x36\xD7\x6F\xAF\xD8\x99\xBE\x91\x63\x9B\xFB\x9B\x8C\x9B\x72\x98\x6B\xD0\x75\x5D\x8F\xF9\x75\x72\x97\xEF\x72\xFC\x98\xDA\x9A\xF1\x9A\x07\x36\xCF\x6C\xBB\xCD\x91\xB2\x9A\x28\x9B\xCA\x98\xA3\x98\xED\x9B\xF7\x32\xDC\x6F\x86\xBC\x59\xAD\x9E\xE1\x77\xF7\x9A\x4D\x9B\xE0\x9B\x1A\x37\x82\x6F\xA6\xB8\x9D\xB0\x9E\x4A\x9A\xD9\x95\x41\x96\xFB\x98\xC4\x1E\x88\x5E\xAD\xFA\x70\x88\x91\x72\x97\xF4\x98\xC6\x9A\x8D\x96\x19\x36\xF8\x5E\xAC\xD8\x8A\xA2\x9E\x62\x9D\xD5\x98\x8C\x9B\x57\x9B\x56\x36\xA1\x65\x98\xD9\x96\xF5\x61\xF7\x00\xFA\x93\x75\x7E\x0B\x9C\x4D\x35\xA9\x6C\x87\xD1\x94\xBE\x91\x2F\x9B\xD5\x99\x0B\x9D\x95\x9A\xAE\x36\xC3\x69\xB0\xDA\x92\xC1\x92\x6B\x9C\x06\x9F\x3F\x00\x51\x97\x2C\xC1\x38\x70\xA4\xD5\x9A\xC1\x9F\x50\x9A\x01\x9D\xFA\x98\x06\x9C\xB2\x32\x8E\x70\xB4\xCA\x90\xC0\x9F\x3E\x9A\x02\x9C\x37\x9B\x00\x9C\x79\x31\x93\xFC\x79\xBA\x81\x51\x85\xE6\x62\x09\x9F\x61\x9A\x26\x9C\xE3\x35\xCE\x70\x94\xD3\x90\xC2\x9D\x37\x9A\x0A\x9F\xDF\x98\xF5\x9A\x30\x31\x9A\x6D\xBF\xC9\x84\x9C\x9F\x9F\x54\xC2\x9A\xEF\x9A\xFA\x9B\x6D\xF8\x76\x6F\xBC\xE0\x90\xAD\x9E\x83\x9A\xFF\x9A\x0B\x9C\xFE\x9B\x30\x38\xFE\x6F\xB1\xDA\x80\xC0\x9C\xEC\x85\xB2\x8B\xEA\x90\xBD\x83\x00\x00\x5E\x70\x99\xD6\x94\x99\x95\x77\x93\x03\x9C\xCD\x9A\x8E\x99\x36\x37\xD8\x55\xB8\xDC\x9A\x56\x91\x0F\x97\x48\x76\x08\x9C\xD7\x6D\xCF\x33\xFB\x75\x4A\x64\x42\xC4\x9C\x5A\x9E\x91\x9A\xA1\x98\x31\x9C\x11\x35\xF5\x70\xB2\xD6\x98\xBE\x98\x4D\x9C\x0A\x9E\x36\x9A\x2B\x9C\x19\x35\xB5\x6C\xB8\x69\x8C\x53\x8F\x4C\x87\xAC\x28\x1C\x9C\xA6\x86\x72\x38\xBD\x69\x89\xD1\x8E\x75\x9A\x52\x9E\xB6\x94\x4B\x9A\xDC\x96\x2E\x35\xBA\x5B\x93\xC9\x93\xB5\x92\xC7\x92\xF7\x82\x79\x98\x2B\x8C\x50\x28\x83\x21\x9F\xD5\x81\xE8\x8F\x78\x99\xF5\x30\x25\x9C\xDE\x9A\x66\x33\x8B\x67\xBD\xD9\x88\x98\x95\x10\x9A\x9F\x9B\x07\x97\xC8\x99\x9F\x2C\xE5\x68\xBE\xB8\x8F\xB3\x92\x5C\x8F\x36\x98\xF8\x77\xDC\x98\x3A\x2F\xBD\x71\xBD\xDD\x87\xC5\x9C\xD9\x84\xEA\x98\x26\x9D\xC5\x9A\x64\x38\xEB\x67\x9C\xE2\x95\xA8\x9E\x89\x9F\xA2\x98\x28\x9D\xC9\x9A\x4E\x2F\x9D", "\x6D\xB5\xCF\x94\xAE\x83\xF5\x97\x87\x9B\xFF\x87\xF8\x83\x83\xB9\x3F\x71\x97\xD8\x8E\xB9\x9E\xEF\x90\xE6\x9A\x0A\x9C\xFC\x9B\x2C\x38\xF6\x70\x80\xE1\x8F\xC1\x92\x84\x99\x06\x9E\xB8\x99\x59\x9C\x82\x2F\x88\x6D\xA1\xC2\x90\x44\x9A\x59\x67\x56\x8D\x3A\x9C\x6A\x9C\xC0\x0E\xD6\x71\xA9\xDA\x9D\xC1\x96\x7D\x9B\x13\x9F\xFE\x9B\x4E\x9C\xFD\x37\x91\x70\xBF\xDF\x8D\xAF\x9E\x1D\x96\x39\x98\x78\x91\x05\x91\xB7\x36\xD5\x59\xB9\xDA\x94\x6F\x9F\x7C\x9F\x04\x9F\x4C\x97\x97\x9B\xBF\x35\xE6\x6F\x9F\xD1\x88\xBF\x99\x66\x9A\x4F\x9B\x9A\x9B\x75\x9A\x84\x36\xED\x69\x8C\xE3\x8B\xF9\x87\xEB\x94\x08\x78\xB2\x9B\x8E\x69\xCA\x36\xA2\x5F\x91\xBD\x87\xC5\x80\xAE\x70\x4D\x96\x1C\x9B\x71\x75\xFB\x69\x26\x53\x96\xE4\x8F\x6D\x9E\x5B\x99\x6F\x9B\x35\x9C\xCE\x9A\xD9\x38\xD6\x69\x9B\xE3\x8F\xAC\x9D\x8D\x99\xB2\x9B\x37\x9C\x24\x91\x9A\x34\x9B\x3B\x9C\xD2\x80\x35\x96\xFC\x92\x50\x96\xB9\x9B\xE4\x97\x4F\x37\xDC\x14\x32\xE4\x8D\xB9\x91\x8C\x99\x95\x9B\x3B\x9C\x82\x9C\xF9\x37\x86\x72\xB7\xE1\x88\xC8\x99\x87\x9A\x21\x9F\x1E\x9D\x27\x4B\xA3\x32\x9F\x4D\xAA\x22\x85\xCA\x98\x59\x00\x94\x99\x75\x8E\x15\x90\x32\xB5\x03\x74\x4B\xE5\x80\xBA\x9C\x8E\x9C\x68\x99\x46\x9D\x8D\x9B\x86\x38\x98\x6F\x88\xE2\x9A\xBC\x9A\x88\x9C\xF3\x98\x23\x9C\x46\x94\x0C\x1F\xB1\x55\xBA\x52\x96\x92\x93\x71\x98\xFF\x95\xAD\x94\x4A\x49\x63\x39\xD2\x6E\x98\xE0\x85\xBF\x98\x96\x98\x23\x98\x02\x90\x2B\x8E\x49\x37\xF5\x63\xAF\xAA\x9B\x17\x89\x8D\x81\x99\x98\xF4\x8C\x94\x9B\x6F\x32\xAA\x6E\x97\xF7\x79\xCB\x9F\x77\x9D\x2C\x9F\xD9\x98\x49\x9B\xD7\x36\x94\x6D\xBD\xD1\x9A\xB6\x9F\x47\x98\x0D\x9D\xE0\x98\x35\x9C\x83\x33\x9C\x1C\x81\xCA\x8F\xC8\x5C\x98\x9A\xF2\x9A\x63\x9C\x61\x9C\x1A\x39\xE6\x69\xA0\xD1\x86\xC6\x99\x01\x9C\x9F\x98\x8F\x96\x65\x9C\x9F\x2E\xA3\x72\x9D\x65\x97\x14\x97\x58\x86\xC3\x75\x67\x9C\xE0\x9B\x9F\x39\xCE\x72\xA1\x26\x91\xA1\x95\x7B\x94\x34\x9F\x41\x98\xD3\x9C\x1B\x30\xA8\x73\x9D\xC0\x85\x15\x91\x70\x90\xB8\x8E\x58\x44\x43\x93\x46\x30\xAF\xC3\x49\xD4\x8E\x40\x81\x93\x98\x20\x9D\xC4\x86\x57\x99\x55\x37\xF6\x6B\x97\xDD\x8F\xBD\x99\x75\x99\xF6\x9A\x65\x9D\x40\x9A\x98\x39\xC3\x61\x9F\xDE\x96\xBB\x9B\x2B\x9A\xF4\x99\xAF\x99\x68\x91\x60\x30\xB0\x72\x8C\xA7\x2F\xCD\x97\x81\x99\x36\x9D\x0A\x9D\xD9\x9C\xBE\x34\xB5\x73\xB3\xD0\x9A\x71\x98\x9B\x99\x21\x9A\x6E\x9D\x85\x98\xEE\x34\xEA\x64\xB2\xC1\x8C\xBC\x98\xDD\x95\x0E\x9A\x52\x9B\xDC\x34\xDC\x39\xB9\x70\x93\xDD\x8F\xA4\x99\x9C\x9D\xF5\x9B\x72\x9C\xB7\x9B\xCD\x39\xF3\x6D\x8F\xE7\x8F\xB0\x91\x9D\x9B\xBB\x9A\xED\x9A\x44\x98\x9F\x17\xBC\x65\xB0\x66\x94\xCE\x81\xCF\x79\x3E\x9F\x12\x9D\xF9\x9C\x97\x38\x83\x72\xB4\xE1\x85\xC8\x97\x5E\x9B\x27\x9C\x68\x9B\x9E\x9C\xA2\x35\xBF\x72\x9B\xDA\x9F\xCF\x9B\x2F\x9F\x19\x90\x7D\x91\x90\x95\xBB\x38\x9E\x0D\xA1\xD5\x92\x4C\x56\xA0\x9F\x0B\x9C\x82\x9C\x4C\x99\xF7\x37\xD0\x72\xB1\xE3\x92\xCA\x93\x8F\x98\x0F\x9D\x3D\x9C\x3D\x9C\x44\x38\xFC\x70\xAD\xB6\x4D\xBE\x99\x39\x9E\x20\x01\x87\x9D\x41\x9C\x3C\x36\x86\x66\x83\xE3\x8D\x9C\x9D\xC1\x96\x36\x9E\x5C\x99\xF2\x9C\x74\x31\xE7\x73\xB6\xC5\x8A\xCD\x92\x17\x4D\xC5\x97\x3C\x84\x69\x37\xC6\x39\xD6\x1E\x89\xE8\x81\xD1\x9B\xA0\x99\x2A\x9D\x83\x9D\x83\x9C\xDC\x38\x89\x72\x95\xE1\x8B\xC8\x9F\x70\x98\x8D\x8E\x01\x82\x62\x5B\x2F\x3A\x95\x71\x99\xDC\x9C\xCB\x9A\x81\x9E\x2F\x9F\xC0\x96\xC0\x9C\x87\x37\xCA\x6E\xB5\x8D\x8F\xBF\x91\xBD\x59\xC9\x99\xC7\x8E\x8E\x7C\x54\x15\xB6\x57\xAE\xE8\x81\xD2\x92\x20\x9C\x3E\x9F\x4D\x9D\xF2\x9A\x9A\x38\xC7\x74\x93\xE5\x89\xD2\x95\x95\x9B\x49\x9F\x55\x9C\x7F\x83\x14\x38\x80\x71\x91\xE9\x80\xC6\x9D\x5A\x9B\xFA\x9A\x2A\x9D\x15\x9C\xAC\x38\xAC\x6D\xA5\xE8\x94\xCA\x97\xA2\x9E\x2A\x9D\x8A\x9C\x86\x9C\x2E\xDB\x02\x70\x91\x8B\x84\xC1\x9C\x89\x70\x48\x9F\x01\x9D\xBB\x9A\x09\x38\x8A\x74\x90\xD9\x89\xD3\x92\x65\x9E\x41\x9C\x6D\x9A\x08\x9D\xB6\x35\xCC\x74\x9D\xDF\x92\xC2\x49\x36\x93\x6B\x77\x9C\x9D\x75\x9C\x4D\x39\xDF\x73\x9F\x29\x94\xCD\x9A\xB5\x93\x3C\x9C\x58\x99\x57\x9C\xB2\x2E\xB1\x71\xB4\xBA\x86\xB4\x90\xE8\x60\x09\x9E\x6B\x9C\x32\x9D\xC2\x32\xCD\x70\x8A\xEA\x8B\xC0\x9C\xA8\x9D\x01\x9E\xA3\x9D\xF4\x9A\x90\x3A\xEB\x6B\x92\xEA\x91\x9F\x9E\x20\x9F\x96\x80\xE6\x99\x80\x99\x63\x3A\x87\x75\x86\xD1\x8A\xD5\x94\xA4\x9B\x51\x9C\x83\x9D\x46\x9D\x48\x3A\xBC\x72\x8A\xE9\x9F", "\xC4\x93\xAB\x9F\x0A\x9E\x7B\x9A\x13\x96\xE1\x37\x82\x02\x17\xEA\x88\xB1\x9F\xA1\x98\x39\x9F\x99\x9D\x04\x9B\x39\x39\x8D\x6B\xAF\xEA\x94\xB2\x93\xAC\x9E\x1B\x9D\xB1\x9D\x50\x9C\xF0\x2A\xFE\x70\x97\xA0\x95\x1C\x7B\xAC\x9B\xC7\x98\x18\x9D\x44\x9D\xBD\x3A\xAC\x75\xBF\xEA\x8E\xD5\x91\xAC\x9F\x41\x9D\xB5\x9C\x9F\x9C\xD7\x3A\xE0\x71\x98\xE1\x89\xA3\x9E\x06\x8B\x89\x94\x82\x80\x43\x7B\xDD\x3A\xCD\x6C\x84\xE2\x94\x3C\x93\x78\x9E\xF8\x99\xE1\x9A\xA4\x9B\x59\x3A\x82\x73\x8B\xDF\x8B\x18\x5F\x88\x9E\xA5\x80\x0B\x65\xC1\x5C\xF1\x3A\xA7\x6D\xB3\xEB\x85\x3D\x99\x96\x9C\xF0\x99\xE6\x9A\xC3\x9B\x9B\x37\x88\x6F\x9D\xDE\x8B\x1F\x91\x67\x9C\xDB\x66\xC2\x87\x58\x6D\x79\x2C\xF8\x6C\x8A\xEB\x88\xD5\x98\x37\x9E\xFF\x97\xB3\x9D\x1F\x9B\x0A\x36\xB7\x64\x8C\xD8\x89\x90\x92\x7B\x9E\xAD\x98\xED\x9B\xE4\x9A\xE1\x38\x8C\x68\xB6\xE2\x9E\xB4\x93\x22\x85\x46\x01\x24\x88\x09\x9A\x66\x37\x89\x02\x01\xEC\x8A\x8D\x98\x6A\x99\x5C\x9F\x13\x9D\x56\x9D\x51\x38\xD3\x75\x8F\xE0\x87\xD7\x91\xA1\x99\x5D\x9C\x69\x9B\x90\x9D\x01\x24\x87\x10\x8F\xC7\x8B\x67\x97\xF3\x81\x0F\x8E\xDE\x9A\x74\x9C\x05\x3A\x94\x76\xAE\xD0\x86\x5D\x93\xA3\x9C\x53\x9F\xE5\x95\x56\x9C\xB0\x2E\xA0\x75\xB0\xBB\x82\xD5\x92\xEF\x94\x54\x9E\x6D\x98\x7D\x9C\x5D\x35\xFC\x71\xB1\x6A\x63\xB5\x96\x7A\x9B\x20\x03\xCA\x9C\xE0\x98\xDF\x3A\xEA\x6E\xB5\xE7\x87\xB8\x9D\x76\x9B\x32\x9E\xC2\x9B\x6D\x9B\x71\x37\xDC\x6E\xBD\xE7\x91\xB0\x9C\x69\x9C\xD6\x9A\xDA\x97\x3F\x8B\x66\x0F\xF3\x2B\xA3\x65\x6A\xC3\x76\xA8\x98\xFA\x99\x43\x9B\x5D\x9D\x61\x38\xAB\x75\xAF\xEC\x83\xD7\x91\xB3\x9D\x5C\x9F\xA3\x9C\x9A\x9D\x91\x3A\xEF\x74\x93\xEA\x81\xD4\x99\x85\x9A\xA0\x63\xE6\x8F\x64\x9B\x6D\x34\xCB\x6D\xAB\xE4\x95\xD6\x88\x5D\x63\x9E\x94\xA5\x49\xEC\x94\x4C\x39\xF5\x74\xBB\xE0\x97\xD3\x90\x8F\x99\x4F\x9F\x0F\x9C\x57\x9C\x41\x38\xAD\x6A\x83\xE1\x97\xC7\x94\x91\x80\xDC\x9A\x50\x9C\x71\x9B\x44\x39\x9E\x69\x91\x80\x87\xCA\x9C\xB0\x90\xDD\x98\x87\x83\x93\x00\x88\x3B\xE4\x72\x99\xEA\x82\xBA\x9F\x94\x9D\x48\x9F\x88\x9C\x35\x9D\x7B\x3A\xEC\x74\xBD\xE9\x8E\xD3\x9F\xA7\x9A\xD0\x93\x41\x96\x4C\x8A\x3F\x32\xBD\x02\xA7\x80\x81\x7F\x9A\x9E\x9B\x48\x98\xF9\x96\x0F\x77\xA1\x3B\xFA\x72\x9E\xE7\x84\xDD\x90\x9E\x9B\x15\x9F\xA6\x98\xA4\x9D\xEE\x2E\xCA\x76\xBE\xBD\x8C\xDA\x90\xF8\x90\x1F\x9C\x8B\x70\xF2\x70\xB4\x34\xB9\x2E\xB6\xE5\x91\xC5\x7F\x4B\x8E\xD0\x79\xEE\x9D\xC6\x9C\xA3\x3B\x81\x6F\x83\xDF\x80\xB6\x90\x87\x95\x23\x9E\xFA\x9B\x8F\x9C\x5A\x33\xED\x6C\x9C\xCD\x8E\xDA\x9F\x95\x98\x99\x9B\x25\x74\x2F\x7B\x5C\x2D\xA9\x6E\xB8\x89\x89\xD6\x91\x10\x07\x79\x9E\x67\x9D\xE8\x9D\x94\x37\xA5\x77\xBE\xEA\x86\xD2\x90\xAC\x9B\x4D\x9E\xB0\x9D\x36\x9D\xC4\x3A\xFA\x76\xB4\xEA\x8E\x39\x6B\xE0\x8A\x32\x56\xF9\x9C\xD8\x9C\xE8\x3B\xC2\x6F\xAA\xEF\x82\xD7\x9C\xBE\x9C\x5C\x9E\xFB\x9C\x73\x9D\xF0\x3B\xD6\x75\xB2\xEF\x86\xD6\x94\x25\x9C\x35\x9F\xC2\x8B\xCA\x71\xF7\x3B\xDD\x73\xB9\xEF\x99\xC0\x93\xBD\x9D\x5E\x9F\xE5\x93\x0E\x9C\x4C\x33\x9F\x70\x8F\x22\x9D\xCD\x99\x63\x89\x33\x8D\xF1\x96\xB8\x8B\xA6\x32\x84\x55\xA8\xCA\x82\x72\x99\xC0\x9A\x3E\x9F\x5E\x9C\x3E\x9B\xA1\x39\xF8\x69\xA7\xD3\x91\x61\x96\xF0\x8D\xF2\x8F\x02\x90\x5A\x93\xE7\xEB\x5C\x3C\x8B\x70\x94\xA2\x90\xDF\x95\xCE\x9B\x0B\x93\xEC\x9C\x2E\x2E\xA0\x77\x82\xED\x94\xB6\x99\x58\x9F\x62\x9E\xD5\x9B\x8C\x9D\x93\x34\x9B\x76\xB7\xCE\x9D\xD8\x90\x58\x9F\x63\x9F\x91\x9B\x02\x9E\xD6\x2D\xEC\x73\xBF\xEC\x8E\xBC\x9B\x3F\x9D\xD1\x9A\x0C\x9E\x5D\x9D\xD2\x37\x8B\x77\x85\xED\x81\xCF\x9D\xA9\x98\x78\x9C\xDF\x96\xE1\x9D\x62\x31\x93\x77\xB8\xD0\x86\xDE\x9C\x07\x91\x67\x9F\xB8\x7A\xEB\x9C\x03\x3A\x81\x73\x65\xDE\x97\x83\x97\xC4\x9E\x6D\x9E\x5D\x9A\xB8\x9D\xE0\x3A\xF3\x70\xAB\xEF\x87\xDD\x9D\xBE\x99\x75\x9F\xFB\x9D\xD5\x9D\xF1\x3B\xAD\x77\xBB\xED\x86\xB9\x8F\x09\x9C\x5F\x9B\x3E\x9C\x0C\x9D\xBB\x37\xB7\x03\x9B\xE8\x8F\xC8\x5D\xC1\x9F\x40\x9F\x07\x9E\x72\x9A\x21\x3C\xC1\x6B\xB9\xD3\x9E\xD4\x97\x1C\x98\x47\x9D\x72\x98\x29\x9E\xC5\x34\xD4\x78\x86\x8A\x9F\x70\x94\xC7\x9B\x86\x9C\xA4\x9B\xD5\x9B\x50\x35\xDC\x76\xAE\xDE\x98\xCF\x9A\xC3\x9F\xBA\x98\x0F\x9F\xEC\x9A\x63\x3B\xBB\x67\xAA\x40\x7E\xD1\x9A\x2E\x6C\x4B\x05\x1D\x9E\x0F\x9D\x77\x3C\xF6\x69\xB9\xF1\x9E\xB3\x96\x35\x98\xD0\x99\x3A\x9A\x41\x9B\x20\x39\xBA\x74\x8F\xCC\x9C\xD1\x9D\x97\x71", "\xFE\x98\x29\x9B\x81\x00\x97\x3C\xB0\x74\x99\xED\x88\xE4\x96\x66\x9D\x79\x94\xB6\x9B\xF4\x9B\x94\x39\xEB\x6F\xA1\xED\x8D\xBF\x9E\xC3\x9C\xE9\x99\xAD\x9D\xC8\x74\x13\x21\xBF\x66\xBC\x32\x56\xE4\x96\xC8\x9C\xE0\x98\x2B\x9E\xC8\x9C\xAE\x3C\x92\x73\xAA\xD5\x9F\xDA\x95\x99\x99\x56\x9D\x1A\x9C\x09\x9D\x94\x9D\x2E\x4F\xB1\xF0\x89\x08\x09\xCA\x9A\x4A\x9C\x0A\x9C\xDE\x9D\x9B\x3A\xCC\x78\x87\xED\x9A\xD3\x90\xB9\x9C\x1E\x9E\xE4\x9C\x7B\x9C\x53\x3C\xB3\x70\x97\x10\x9D\xD7\x96\xEC\x89\x6C\x99\xCF\x9A\xEC\x94\xBD\x3C\xAA\x6F\xB5\xF0\x92\xDB\x93\x86\x98\x66\x9D\x19\x9C\x99\x9D\x53\x38\xF8\x76\xB2\xEA\x83\xE0\x98\xAD\x9E\x08\x9E\x0D\x9C\xF2\x9D\x00\x00\x4D\x79\xB4\xE9\x96\xC4\x90\xA2\x9A\x8C\x9C\xFF\x9C\x32\x9E\xFE\x3B\xE6\x78\x80\xF0\x88\xE3\x92\xC0\x9A\x8D\x9F\xFC\x9C\xEE\x9A\x85\x33\x94\x30\x94\x1D\x72\xE7\x98\xA9\x9A\x71\x9C\xAF\x9C\x7B\x9E\x73\x3B\xFD\x77\xB5\xED\x9F\xDF\x97\xB7\x99\x80\x9C\xBA\x9C\x76\x9E\xEA\x3A\xC8\x6C\x82\xEA\x81\xC1\x82\x60\x9E\x7E\x9D\x38\x9E\x04\x9C\x5A\x3B\xB6\x78\x8A\xE7\x98\xE1\x91\x64\x9D\x91\x9F\x90\x9B\x47\x9E\x45\x36\xB5\x79\x9C\xE9\x8D\x76\x9A\x39\x97\xD9\x97\x75\x7E\x82\x9E\xCC\x3A\x99\x79\xA6\xD4\x8C\xDC\x92\xA2\x9E\x71\x9E\x3C\x9D\x6A\x9E\x26\x3A\xD7\x79\xA8\xE8\x94\xDC\x95\x84\x9F\x78\x9F\x88\x9B\x3F\x9C\xD0\x0E\xA8\x7A\x9E\xEB\x8D\xD6\x9F\x2E\x9C\x9C\x9D\x26\x9C\xBA\x9D\xE7\x3C\xF6\x76\xB0\xEA\x8A\xE7\x97\xCC\x9E\x66\x9F\x84\x9D\x75\x9D\xA6\x35\xF7\x5D\x96\xD6\x82\x08\x0A\xD3\x9A\x5E\x9D\x8C\x9D\x17\x9A\x4B\x3C\xBE\x77\xBF\xD2\x94\xE6\x99\xB4\x99\x72\x9C\x2C\x9C\x40\x9E\xFF\x34\x82\x79\xB5\xA6\x7C\xE6\x9B\x84\x8B\x30\x5D\x53\x9E\x81\x9D\x4F\x3D\xC4\x76\x9B\xF2\x84\xC6\x9F\x67\x99\x8C\x98\x71\x9A\x75\x9A\xD9\x3B\xA1\x72\xAE\xD9\x9C\xDE\x91\xD3\x8C\xE7\x8E\xCE\x9D\x87\x9C\x75\x2C\xB8\x43\x90\xEC\x9E\xEA\x97\xD1\x98\x51\x9D\x46\x9E\x9F\x9E\xD8\x38\xE6\x79\x9A\xE3\x82\xEA\x94\xAD\x9E\xA1\x9D\xCD\x9C\x88\x9E\x37\x3B\x8B\x68\xB5\xE2\x9D\xF9\x82\x67\x9F\x91\x95\x73\x90\x17\x9E\x15\xF0\x77\x6C\x86\xF1\x8C\xE6\x95\xD7\x98\x8C\x9F\x5D\x9E\x97\x9D\xE5\x3C\xC0\x7A\xBB\xF5\x8C\xE8\x93\xD4\x9E\xAF\x9D\xDE\x9C\x7F\x9E\x04\x3C\xB4\x71\xA2\xD0\x8F\xEB\x91\x7A\x8F\xC7\x65\xA3\x75\x06\x91\x7D\x28\xF4\x7A\x88\xF1\x9F\x6B\x9E\x8E\x9D\x77\x9C\x9E\x9D\xDF\x9D\x54\x3D\xC1\x77\x96\xF5\x81\xD5\x98\xD5\x9F\xA5\x9A\x56\x9F\x68\x96\x53\x34\xC6\x6A\x87\x62\x91\x44\x98\x0A\x8C\x6A\x9C\x17\x9E\xC6\x9E\xA3\x3D\x90\x5F\xB6\xE4\x98\xEB\x98\x93\x9A\xAF\x9E\x4E\x9C\xBE\x9E\x33\x3B\x96\x7B\xAB\xF3\x98\xEC\x9D\xCE\x9B\xE6\x87\xD3\x96\x2E\x9B\x2C\x24\x8B\x3F\xB1\xF1\x8B\x22\x78\xD4\x88\x06\x78\x2F\x9F\xDC\x9E\x01\x31\xBB\x7B\x90\xF6\x9F\xE9\x9A\xD0\x99\xA8\x9C\x65\x9F\xBE\x9E\xFC\x3C\x8F\x7A\x84\xF7\x91\xE8\x92\x8A\x9F\x41\x9B\x10\x92\xD2\x97\xB9\x28\xA4\x31\xA2\x7E\x6C\x67\x97\x54\x3A\xCE\x93\x52\x9E\x19\x72\x8D\x3D\xC9\x78\x87\xF4\x8C\xE9\x96\xBA\x9E\xA5\x9C\x89\x9C\x98\x9E\x7C\x3A\xB2\x7A\xBE\xE9\x94\xE9\x9A\xE9\x59\x28\x9E\xF3\x86\xCC\x9D\x5B\x39\x9A\x77\xA3\x83\x5C\xDC\x94\x76\x9E\x73\x9F\xEC\x97\x62\x5F\xE9\x3D\xA4\x7B\xA7\xE5\x95\xD2\x9F\x6E\x9F\x2F\x9E\x16\x91\xB6\x96\xB7\x22\x86\x5A\x90\x88\x9E\x69\x87\x2A\x92\xBA\x8E\x70\x8F\x7E\x9B\xDD\x3B\xAB\x5A\xB1\x6E\x86\xB4\x74\x9F\x93\x26\x9D\xB0\x96\x19\x99\x16\x3B\xBC\x7B\xA8\xE9\x92\xEC\x9F\xDB\x9F\xBA\x9D\x70\x9F\xEC\x9E\x7F\x3D\xDB\x7B\x81\xF6\x9D\xC3\x9D\xBB\x88\xE7\x8B\xEF\x8D\x1C\x89\xCC\x3B\xDA\x64\x95\x8E\x75\xF0\x99\xB8\x9C\x9E\x9E\xB3\x9C\x0D\x9F\xD0\x3A\xBE\x7B\x92\xEB\x80\xEE\x99\xCE\x9A\xB8\x9D\x51\x9E\xC0\x9E\x47\x3D\xA4\x7C\xB7\x77\x8C\x93\x9B\xD5\x93\x2E\x8D\x7F\x8E\x78\x9E\x2C\x3E\xA2\x77\x86\xF4\x91\xDB\x93\xDD\x99\xAF\x9C\x87\x9F\x19\x9F\x1E\x3E\xB5\x7C\xA0\xF8\x97\xEC\x94\xDF\x98\x50\x9C\x87\x54\x10\x98\x11\x31\xE8\x7B\x90\xF7\x98\xF0\x94\x01\x9C\x35\x98\x8D\x9C\xB8\x98\x36\x3A\xB0\x63\x88\xE3\x92\x8D\x9A\xD6\x9B\x7B\x9F\x6B\x9E\xF7\x87\x06\x3C\xBB\x44\x94\xF8\x81\xF0\x9A\xDB\x99\xC3\x9D\x91\x9F\xDE\x9E\x47\x3E\x9E\x6B\xA8\xF3\x87\xC3\x96\xCC\x9F\x32\x9C\x32\x9E\x4B\x7B\x59\x39\xC3\x72\xB9\xF7\x85\xA8\x96\x70\x97\xA0\x9B\x69\x97\xB9\x8B\xD2\x38\xB9\xD3\x01\xF9\x9A\xDD\x9B\xC0\x9C\x4A\x9D\x03\x9F\x82\x9D\xF6\x3A\x87\x76\xB8\xEB\x89\xD8\x9A\xA5\x98\x14\x97\x9B\x88", "\x00\x9D\xBB\x22\xD8\x78\x93\x67\x86\x6A\x6F\x2B\x9F\x3E\x97\x94\x9F\x9A\x9C\x66\x3E\x88\x7A\x91\xF6\x95\xEE\x93\xD9\x9A\x9F\x9D\x43\x9F\x25\x9F\xC3\x3D\xCD\x7C\x8D\xE9\x91\x83\x9F\x2C\x9B\xA6\x99\xCA\x9C\x5A\x71\x64\x3E\xD1\x7B\x91\xFA\x8C\xEF\x93\xC6\x9E\xBD\x9C\xEA\x9C\xF8\x9E\xAA\x3B\xF2\x7B\xAC\xEE\x9A\xF4\x9B\xC6\x9C\x5C\x99\x08\x84\xD5\x8C\xF4\xBF\x6E\x5B\xBB\xEC\x8F\x5A\x90\xDC\x91\x86\x8C\x71\x9D\xEE\x71\xA1\x3E\xD4\x7C\xBA\xC4\x92\xB9\x9A\x31\x9F\x10\x9E\x87\x9B\x3F\x8F\xCF\x1D\xD6\x5A\xA3\xF4\x96\x11\x9F\x7A\x8C\x35\x05\xEC\x8B\x59\x9F\x46\x27\xF1\x1B\xA7\xAD\x9E\x3A\x97\xDD\x7B\xCF\x9C\xF4\x9D\x21\x9F\x61\x3C\xA4\x7D\xB7\xF3\x86\xF5\x95\xC6\x98\xD5\x9F\x19\x9E\x55\x9F\x69\x3C\xAC\x7D\xBF\xF3\x91\xAB\x9D\x38\x33\xAE\x9B\xD0\x71\x5C\x9F\x90\x3E\xD5\x7C\x94\xCD\x9C\xE4\x92\x5C\x9E\xAC\x9D\xA0\x9B\x2D\x9F\x64\x34\xC4\x77\xA6\xD1\x8C\xEB\x97\xE0\x3C\x92\x9F\x7E\x90\x67\x9F\xE7\x3B\xD0\x7D\x8F\xF6\x92\xF4\x94\xDD\x98\x9F\x9F\x42\x9E\x4B\x9F\x95\x3D\x98\x7D\xB7\xF8\x82\xF1\x99\xE3\x9F\x73\x96\x29\x9F\x80\x9B\x1B\xE2\x60\x7D\x98\xE4\x92\xEE\x94\xEF\x9E\xC8\x9C\xA5\x9F\x0E\x9F\xF8\x3E\xD8\x7B\x98\xFB\x9D\xE7\x9A\xED\x99\xB3\x9D\xEC\x95\xBE\x9D\x40\x18\x84\x70\xA9\xD6\x90\xF7\x98\xBF\x9A\xDE\x9F\x2F\x9E\x83\x9B\x91\x39\x88\x6E\x9E\xED\x90\xBD\x9A\x9F\x9D\xCD\x9C\x74\x9D\x37\x9F\xC8\x81\x4A\x79\xBF\xD7\x6C\x1B\x72\xF0\x9D\x1D\x9F\x80\x9F\x3F\x9F\x56\x3A\xAD\x69\x98\xE9\x84\xF4\x9A\xAF\x98\x3F\x8F\x7F\x9B\x92\x9C\x43\x1F\x84\x75\xAF\x9E\x8E\xF4\x9E\xC5\x99\xBC\x9A\x5D\x9F\x8B\x9F\x6B\x37\x8A\x79\xB7\xE7\x9B\xF8\x99\x9F\x9B\xE1\x98\x48\x9F\x86\x9B\x46\x3D\xEB\x70\xA1\x3F\x55\xD4\x9D\xEC\x9D\xE4\x9E\x59\x9C\x82\x9F\xD2\x3E\x89\x7A\xB6\xFB\x96\xEE\x99\xF0\x9F\xC3\x9F\xC2\x9E\xED\x9E\x0D\x3F\xC5\x7B\xAD\x1E\x78\xAB\x8C\x04\x88\xDA\x84\xC5\x9E\x05\x9E\x16\x3F\xE3\x79\xA7\xF9\x9B\xF0\x97\xF0\x98\xC9\x9D\xD3\x9E\x25\x9F\x4F\x3F\xA1\x7C\x91\xFD\x9C\xEE\x9C\xB7\x9C\x5D\x9E\x2B\x4B\x5B\x9D\x21\x30\x81\x7E\x8F\xFA\x83\xF8\x93\xEA\x99\xAA\x9F\x69\x9F\xA9\x9E\x8F\x3B\xD5\x7A\x96\xF3\x97\xEA\x98\xCD\x99\x90\x9E\x36\x9F\xA9\x9F\xF8\x01\xDC\x20\x9F\xFB\x8B\xFB\x96\xF2\x98\xE9\x9E\xDB\x9F\xC6\x9D\xA8\x3D\xF1\x7E\xAA\xF6\x93\xFB\x9C\xDA\x9D\xEE\x9D\x56\x9F\xBB\x9F\xB8\x14\xE7\x62\xB8\xF4\x87\xEF\x96\x39\x76\xE8\x9F\x63\x9C\x8C\x9F\xC1\x3C\x9A\x7E\x83\xF3\x9C\xF8\x9E\xF3\x9B\x3F\x9D\xBD\x9B\x48\x9E\x59\x35\xDD\x7B\xB7\x12\x89\x98\x8D\xA6\x8B\x3D\x72\xE3\x9E\xD0\x9C\x7D\x39\x85\x7C\x97\xE9\x87\xF0\x9E\xED\x91\xC1\x9C\x08\x9D\x70\x4C\x30\x3F\x9C\xF0\x62\xCF\x97\xED\x90\xEA\x9C\xEF\x9F\xD1\x9F\xB6\x9F\x63\x3D\xD7\x7C\xAE\xC6\x99\xF2\x92\x46\x98\xDD\x9F\xA0\x9A\x51\x9E\x94\x33\xDF\x7C\x8C\x42\x8D\xD8\x96\x07\x6F\x61\x9F\x00\x7C\x25\x71\x9F\x3F\xB2\x73\x91\xF3\x92\xEA\x92\x9E\x9E\x89\x9D\xA7\x98\x28\x9E\x9F\x32\xAD\x7B\xB2\xE2\x88\xFC\x9B\xC8\x96\xAD\x9C\x5E\x95\x07\x9A\xC5\x15\xA7\x76\x84\x2A\x8A\xEC\x97\xAD\x8C\x4B\x07\xD5\x9E\x0F\x9E\xBB\x3B\xD2\x77\xBB\xEF\x8A\xFA\x94\xED\x99\x9F\x9E\xB5\x9F\x7D\x9E\x61\x3F\xCC\x7C\x99\xF3\x95\xE9\x9D\x7F\x7E\x21\x9D\x67\x9F\xC1\x9D\x9B\x10\xE4\x43\x80\xFF\x8E\xFD\x9F\xF8\x99\xE7\x9D\xC6\x9F\xAE\x9D\x93\x3F\xBD\x7E\xA0\xED\x9F\xF9\x92\x77\x98\xF3\x9C\xDD\x9A\x29\x9A\x50\x3B\xB9\x6F\x92\xED\x8D\x5F\x76\xDB\x99\x95\x95\xEB\x9F\x9A\x9F\xF2\x35\xE2\x79\xBD\xD8\x9A\xE8\x96\x9F\x9C\xA3\x9C\xD6\x9A\x8F\x9E\x70\x37\xF4\x7F\xA2\xED\x80\xF9\x9E\x9F\x9A\xB0\x9F\x66\x9F\xE7\x9F\xA3\x18\xE9\x76\x97\xD1\x8D\xEE\x9A\xF6\x84\xE6\x9E\x85\x9E\xBF\x96\x65\x3E\xE2\x7D\xAB\x52\x7A\xE3\x93\xC2\x9F\x6A\x99\x09\x9E\x5B\x91\x27\x3C\x83\x50\x83\xC5\x98\x1A\x9F\xB7\x98\x25\x9D\xE0\x9C\x95\x9C\x25\x34\xAC\x72\x8D\xC1\x6B\xD1\x6F\x40\x88\xBD\x7A\x82\x94\x73\x81\x96\x16\xA9\x05\xAD\x00\xA3\x58\x8D\xA0\x97\x58\x75\x69\x88\x3E\x92\xA9\x5C\x1B\xCD\x62\xA8\x8C\xA6\x98\xA9\x7A\x4C\x94\x8A\x24\xBE\x83\x69\x55\x3E\x37\x46\xEE\x8A\xC8\x41\xA2\x95\x69\x7F\xE2\x6E\x44\x83\xCE\x2F\xEA\x7B\x84\xF9\x85\xF8\x98\xE6\x9D\xEB\x9E\x9A\x9E\x1A\x9F\x6C\x3E\xC4\x7A\xAE\xF9\x81\xFA\x90\xE7\x9E\xBE\x9C\x6F\x97\xB0\x9B\x9C\x1B\xFB\x7B\x8E\xB4\x87\x82\x9F\x99\x69\x9E\x9A\x90\x35\x22\xA0\x5B\x0B\x81\xD0\x72\xF5\x77\xC8\x9D\xF7\x98\xF6\x9D\xE8\x9F\xF3\x9B\x06\x3E", "\x93\x46\xA6\xF0\x9B\x3B\x95\x87\x6F\xEB\x9B\x6F\x9D\x43\x9A\x29\x2D\x9E\x55\xBF\x0D\x40\xB8\x99\x6E\x98\x44\x95\x01\x86\x9C\x6F\x63\x40\xB4\x72\xAC\xFD\x9A\x00\xA9\x4D\x6C\x03\xA3\x68\x9C\x3E\x9E\x0B\x33\xFE\x78\x8D\xCC\x98\xFD\x95\x68\x9A\xF7\x9E\xBF\x9A\xF2\x8E\x26\x3E\xE6\x3B\x94\xDC\x97\xCB\x94\x04\xA7\x0E\xA3\x11\xA1\x97\x83\x17\x3E\xE1\x7D\xBB\xFA\x84\xBA\x97\x79\x9E\x60\x9F\x5A\x9C\x84\x9D\x6D\x39\x8A\x76\xAF\xE5\x8C\x88\x9F\x56\x58\x2E\x8F\xB2\x93\x3A\x91\xE4\x29\x8E\x60\xA5\xE0\x96\x03\xAF\x80\x70\xD5\x6C\x7E\x97\xB7\x9D\x4A\x40\xD1\x7D\xBF\xFD\x8D\xE9\x91\xF8\x9F\xA5\x9E\xDC\x9F\x98\x9E\x74\x3F\xB3\x7A\xA3\xFF\x8A\xD1\x9B\xF8\x40\xCA\x9F\x28\xA0\x81\x00\x60\x40\xF9\x44\xA2\x01\xAE\x33\x87\x2D\x9E\xB1\x9C\xCE\x9F\xAD\x9D\xEF\x3F\x8B\x79\xBC\xFC\x88\x00\xAE\x9C\x9E\xE3\x9C\x7F\x9C\x06\xA0\x64\x3B\xB4\x56\x92\xCA\x9E\x02\xA1\xD7\x31\x17\xA1\x52\x8F\xE1\x71\xA6\x40\x80\x5D\x81\x00\xB8\xE8\x9F\x0B\xA4\x00\xA2\xCE\x9E\x03\xA0\xCC\x39\xC4\x81\x9D\xFC\x92\x02\xAF\xF1\x9C\x0A\xA3\x20\x9A\x0A\x9E\xE8\x18\xE0\x6E\x85\xC1\x83\xBB\x97\xE7\x9B\x38\x9D\x9E\x9F\x2F\xA0\x8E\x40\xEE\xBE\x7C\x02\xBC\x9C\x97\xF3\x9A\xEB\x9C\x13\xA0\xAE\x9F\x4B\x3F\x95\x7D\x9F\xFF\x97\xF4\x91\xFE\x99\xD3\x9F\x2C\xA0\x27\x9F\xAE\x3E\xAB\xE4\x1F\x3F\x99\xA7\x8C\x9A\x88\xD9\x9D\x0B\x9F\x4E\x83\x30\x3C\xA3\x7E\xBB\xA7\x2E\x06\xAF\xBA\x83\x17\xA0\x12\xA0\x3D\x98\xA9\x40\xF3\x7D\x89\xFD\x93\xF4\x91\x0F\xA0\xE1\x9F\x3C\xA1\x7C\x9F\xF5\x40\xFB\x7D\xA3\xFD\x83\xF1\x90\xC4\x99\xE6\x90\xB4\x99\x99\x93\xF1\xFC\x04\x82\xA0\x9E\x90\x06\xA9\xF3\x6D\x65\x9F\x3B\xA1\x18\x9F\x69\x3E\x8B\x6C\xA6\xE1\x8D\xB0\x96\xF9\x9B\xF6\x9A\xFD\x9F\xDA\x9B\x75\x37\xD8\x12\x97\xF1\x97\xD0\x90\xC3\x8C\x50\x87\x16\x9E\xFF\x9F\xA4\x40\xBB\x17\x93\x7B\x64\x38\x84\x06\xA7\xF5\x9C\x1F\xA1\x41\x6C\xB2\x3F\x89\x66\x80\x02\xB0\x9C\x92\x08\xA2\x72\x98\x21\xA0\x91\x9C\xEC\x3E\xFA\x6D\xB9\xEC\x98\xBD\x9C\xC2\x9F\xA8\x9B\x72\x9F\x8C\x63\xBD\x37\xE2\x66\x81\x04\x1A\x08\xA2\x97\x90\x0F\xA3\x3A\xA1\x3B\x9A\x02\x40\xB2\x74\xB1\xFE\x86\xDA\x99\xCC\x96\xF8\x9C\x0D\x9B\xD5\x9E\x4B\x3B\xCA\x7F\xA3\xEA\x86\x04\xA1\xC0\x74\x90\x9D\x99\x66\xA6\xA0\xE4\x20\xC9\x49\xB9\x01\xB1\x04\xAB\x07\xA3\x12\xA2\xE5\x9B\x5E\x9F\x6A\x39\xBF\x7D\x81\x7E\x86\xAE\x94\xCB\x9F\x24\xA0\xC8\x9D\xF0\x47\xEE\x3E\xA9\xCF\x20\x05\xA6\x2F\x78\xC2\x78\x12\xA0\x06\xA0\x51\x9F\x37\x41\xD6\xB1\x6F\xFD\x85\xFE\x99\xDA\x9F\x89\x9C\x56\xA1\xE1\x9D\x5A\x41\xCD\x76\x9C\x05\xA9\x42\x40\xBA\x92\x2E\xA1\x3A\xA1\x99\xA0\xC0\x2E\xF7\x82\xBA\xFA\x8B\x8A\x94\x09\xA0\x2D\xA2\x25\xA0\xB5\xA0\x82\x23\xEC\x82\x9F\xD0\x88\xE1\x93\x02\xA5\x1D\x99\x2E\x9E\xD4\x9A\xF6\x27\xCB\x82\x87\x06\xB1\x06\xA3\x35\x9B\x03\xA0\xB9\x9F\x3D\x9E\x56\x41\xE4\x73\x88\xFF\x9D\xA7\x91\x18\xA5\x78\x9D\x6C\x3E\x91\x9F\x6A\x2A\x83\x82\x9B\x06\xBD\x08\xA3\xB0\x9B\xF6\x90\x55\xA0\xDA\x96\xA1\x41\x9F\x75\xBF\x05\xB1\xE2\x96\xF8\x9E\xB5\x9C\xF3\x9E\x89\x83\x13\x3D\xED\x73\xBE\x5F\x9F\x78\x7F\x15\xA3\x35\xA3\x58\xA0\xC5\xA0\x92\x40\x8C\x83\xA7\x05\xBC\xB0\x9E\xEB\x98\x82\x9D\xF2\x9B\xA6\x99\xFB\x3A\xBF\xF2\x7F\x03\x0F\xE7\x99\xB6\x93\x2E\xA0\x18\x90\x8E\xA0\xBF\x41\xC9\x80\x82\xF8\x9E\xFB\x93\x15\xA2\x9A\x9D\x55\xA1\xBE\xA0\xC7\x3F\xB3\x83\x89\xFF\x95\x0D\xAB\xFC\x9C\xFC\x9D\x09\x96\xBC\x91\x79\x15\x83\x74\x4E\x07\xA8\x14\x92\x16\xA7\x29\xA3\xB4\x9B\x43\x9E\xEE\x40\x8B\x82\xB5\xFB\x9D\xFE\x97\xEF\x9F\x21\xA2\xC2\x9F\x58\xA0\xF3\x3D\xF7\x81\x9B\xFA\x8A\xAE\x9B\x44\x60\xED\x9D\x94\x9E\x00\x00\xE3\x41\xDB\x46\xA5\x07\xA7\x08\xAB\x21\x9C\x1A\xA1\x7A\xA1\x55\xA0\xED\x3D\xAD\x81\xAF\xF7\x8F\x05\xA1\xDF\x98\x3E\xA3\xAA\x9E\xF9\xA0\xAD\x3E\xF8\x7E\x8E\xBB\x99\x0F\x87\xDD\x79\x3F\xA1\x5B\x94\x83\xA0\x76\x41\xD2\x83\x99\x00\xA6\x0B\xA4\x7C\x9D\x12\xA1\xA0\x9F\x4B\xA0\x83\x3E\x99\x81\x85\xFA\x96\x73\x9E\x2F\x8A\x5B\x9E\x0E\x97\xCA\x71\x0E\x42\xFD\x2D\x9C\x06\xBE\x08\xAA\x1E\xA6\xE0\x9D\x43\xA0\xAF\x9F\xEE\x41\xCE\x7E\x86\x08\xB9\xF6\x98\x20\xA3\xDB\x9C\x52\x9E\x1B\x9B\xEE\x3A\xF0\x20\x86\xDA\x61\x11\xAB\x80\x77\x11\xA0\x4D\xA0\x3D\xA0\x65\x40\xF9\x82\xAD\x67\x64\xFE\x9D\xC4\x98\x3B\xA3\x55\xA0\xC2\x9F\x59\x41\xDC\x83\x9B\x05\xB7\x0D\xA6\xEB\x94\xAB\x9F\x6A\x8B\xC1\x5C\x34\x42\x98\xC8\x50\x08", "\xB7\x11\xA4\x16\xA1\x47\xA0\x85\xA0\xEA\x9D\x68\x36\x9F\x50\xB5\xFE\x9D\x09\xA9\x8C\x9A\xDD\x9F\x32\x9D\xA0\xA0\xC7\x0A\xC3\x2B\x94\xD1\x9B\xF3\x79\xA1\x99\x62\x9F\x62\x9F\x9E\x68\xBE\x41\xE6\x83\xA9\xDE\x9E\x0F\xA3\x00\xA0\xC6\x9C\xC6\x9D\x68\x9D\x4F\x40\xC9\x7C\x91\x01\xB6\xF1\x93\x05\xA0\xC7\x9E\xD0\x9E\xFC\x9F\xCE\x3F\xB5\x6D\x85\x57\x98\x79\x97\x5C\x89\x1A\x9D\x11\x9F\xEA\x9F\xCC\x17\x61\x84\xBC\x07\xBD\x05\xA9\x10\xA5\x1A\xA2\x99\xA1\x1B\x9E\x68\x42\xA2\x82\xAB\xF9\x84\x09\xA6\x0C\xA7\xF2\x9C\x32\xA0\x49\x9E\x65\x3B\xB9\x76\x90\x00\xB0\x8E\x99\xFE\x99\x43\x9C\xA3\x9A\x3C\xA1\x09\x01\x49\x84\xB4\x90\x70\x0E\xA2\x26\xA1\xFA\x9B\x74\xA0\x33\xA0\x04\x3E\xE8\x80\xA3\xFE\x8A\x03\xA0\x02\xA4\x0D\xA0\x08\x9A\x3A\x8C\xC7\x3D\xB3\x3A\xA0\xDA\x88\xEC\x97\x8E\x99\x3F\x93\xAD\x9E\x2E\x05\x92\x42\xC1\x3F\x8B\x09\xA9\x0C\xA2\x21\xA0\x2F\xA3\x93\xA0\x07\x9E\x55\x1E\x89\x71\x80\xC5\x9D\xF6\x8E\x3D\x99\xBA\x8A\xF9\x9E\xE8\x8C\x10\x39\xC2\xD5\x53\x00\xAE\xFC\x87\x5D\x80\x55\xA2\x9E\xA1\x08\xA1\x08\x41\x97\x85\xBA\x08\xB1\x16\x75\xAD\x87\x81\x9F\xCA\x9E\x0D\xA1\x2D\x3F\xCD\x3E\xA6\x59\x60\xB0\x9A\xFE\x48\x42\x99\x85\x99\x94\x9C\xBB\x28\xCC\x6D\x8F\x0B\xA8\x3A\x59\x94\x9F\x24\x01\x89\x95\x57\x7E\x69\xFE\x2C\x85\x81\x0B\xB3\x10\xA2\x1C\xA5\x42\xA2\x63\xA1\x0B\xA1\x90\x41\xD9\x58\x92\x06\xB9\x87\x9B\x40\x68\xDF\x99\x68\x96\xFC\x9E\xF6\xEA\x01\x55\x9B\xEE\x9B\x02\xA2\x9C\x9D\x50\x97\x4B\x9D\x65\x9E\x06\x01\x57\x85\xBF\xF4\x6B\xF6\x70\x2C\xA5\x3F\xA1\x3B\xA1\x32\xA1\x5B\x3F\xA0\x82\x8E\x01\xA2\x14\xA0\x05\xA4\x50\xA0\x37\xA1\x63\xA0\xDE\x40\xEC\x2E\x96\x01\xAC\xE3\x98\x05\xA2\x5D\xA1\x93\x91\xA2\x86\x9D\x40\xE0\x72\x81\x04\x0F\xA5\x80\x88\x9A\x5E\xA1\x61\x7F\x6C\xA1\x40\x2F\xD0\x82\xA4\x09\xB2\x0A\xA7\x06\xA3\x23\x9D\x1A\xA1\xE1\x91\xD8\x3B\xE3\x85\x9B\xAC\x8E\xF9\x99\x30\xA5\xFE\x95\x22\xA1\x2B\x99\xE6\x38\xA7\x2C\x45\xB5\x8A\xC8\x4E\x30\xA4\xB8\x7C\xC4\xA1\x53\xA0\x5F\x3C\xFD\x84\xBF\x07\xB5\x0E\xAC\x23\xA3\x9A\x9E\xE0\x9E\xBF\xA0\x40\x42\x80\x83\x82\x09\xA2\x0C\xA4\x24\xA2\x48\x98\xF8\x4A\xAD\x96\x0C\x30\xA1\x81\xBF\xF8\x89\x5B\x95\x32\xA0\xC3\x7D\xA6\x7F\xB0\x9E\x77\x2F\xA6\x7B\x80\xFE\x90\xFB\x9E\x0A\xA3\xF0\x9C\x2C\xA1\xC2\x9F\xB2\x40\xF6\x7E\x9E\x07\xA1\xA5\x6C\x73\x9E\xF9\x98\x89\x95\x72\x7F\x87\xFD\x52\x81\x85\xD8\x88\x0F\xA8\x2F\xA7\x23\xA3\x99\xA0\x19\x9F\x69\x42\xDF\x7E\xAB\x09\xBA\xF7\x9D\x26\xA4\xDF\x9F\x9B\xA1\x8A\xA0\xF0\x34\xEF\x85\x82\x04\xAC\x4E\x3D\x33\xA3\xC5\x7F\xCF\xA1\x55\x9E\x2B\x43\x95\x86\xA2\xE6\x9C\xC8\x92\x25\xA7\xAC\x9C\x28\x9F\xB4\x9E\x3F\x41\xEB\x7A\xA2\xCA\x83\x18\xA9\x0F\xA1\x73\x9C\x9D\x9E\x85\x95\xD3\x0F\xCA\x83\x9B\xF0\x98\x77\x91\x10\x05\x6C\xA3\x8F\x7F\xB3\xA1\x3C\x3D\xE7\x67\x96\x03\xA1\x06\xAB\xF3\x99\xFE\x9E\x36\xA1\xCA\x9F\x85\x42\xA6\x82\x87\x0A\xB9\xFC\x97\x05\xA6\x8A\x9E\x6F\x96\x96\xA0\x47\x27\xA1\x86\xB8\x87\x81\x08\xA9\x1A\xA4\x6C\xA0\xD4\xA0\xDB\x92\x11\x43\xE7\x83\xBE\xF2\x89\x1B\xA9\x29\xA6\x62\xA3\xA6\xA0\x8C\xA1\x6B\x40\xC1\x62\x97\xC1\x98\x6A\x9C\x50\x7B\x0E\x9A\x46\x63\x69\x99\x5F\x42\x83\x02\x3E\x0D\xB3\xF2\x70\x38\xA2\xA5\x9D\x2A\x9C\x00\xA1\xA5\x3E\x82\x84\xA7\xFA\x84\x10\xA9\xEA\x9B\x45\xA0\xC3\x9F\x16\xA1\x0E\x3F\xF5\x86\xB6\x0D\x5B\x07\xAC\xB4\x91\xC1\x94\x0F\x9A\xBF\x7C\xE9\x32\xA4\x6F\x83\xE6\x4B\x1D\xA1\xEB\x7D\x75\xA1\xF6\x9F\xF4\x9D\x42\x43\xAC\x81\x84\x0D\xA3\x10\xA6\x34\xA5\x40\xA0\xD2\xA1\xF8\xA0\x4A\x43\xB4\x81\x84\x0C\xA3\x0A\xAE\xC6\x99\x6A\x9C\x1C\x9E\xC9\xA1\xC0\xAB\x00\x66\xA9\xFD\x82\x08\x04\x3C\xA7\xF2\x86\xAC\x7F\x3E\x9F\x20\x3C\xEA\x86\xA2\xF0\x9F\x03\xA1\x1B\xA5\x8F\x9F\x68\xA1\xD3\x9C\x56\x42\xA9\x73\x98\x09\xBD\xDE\x8E\x15\xA3\x6B\x75\xF7\xA1\x83\x96\xDF\x43\xD9\x7E\x95\x0D\xA5\x11\xAD\x04\xA7\x44\xA1\xD6\xA1\x14\xA1\x60\x3F\xB6\x87\x90\xFD\x98\x1D\xA2\xF5\x9B\x83\x63\xF7\x9A\xED\x6B\xD7\xFD\x6F\x87\x8B\xF8\x87\x19\xA2\x35\xA3\xCC\x98\xD5\xA0\x8A\xA1\x9D\x43\xEB\x86\x97\x0C\xAA\xB3\x91\x3A\xA4\x56\xA2\x50\x99\x02\x82\xB2\x8E\x03\x74\x42\x10\xAD\x4D\x8D\x4B\x93\x4F\xA0\x3B\xA0\x5F\xA0\x9C\x43\xA8\x7E\xA2\xFE\x8A\xF9\x94\xFA\x99\x30\x9E\xE9\x9F\xC1\x9C\x04\xDB\x1B\x7F\xB6\xBB\x69\xAD\x93\x41\xA0\x9D\x88\xBD\xA0\x26\xA1\xC0\x41\xE5\x82\x9D\x0B\xB0\x12\xAF\xCA", "\x9E\x7A\x9D\x2C\x9F\x8C\xA1\xC1\x3E\x89\x5B\xB2\xF6\x31\xD3\x90\xED\x85\x84\xA3\xBC\x95\x0A\xA2\xF5\x42\xFC\x84\x82\x0B\xAF\x15\xA0\xE8\x9E\x58\xA1\x07\xA3\x7C\x9D\x1F\x44\xC9\x83\xAD\x7A\x8A\xC3\x82\xF3\x9E\xC0\x82\xB5\xA1\xCB\xA1\xC6\xFD\x24\x84\xB0\x0E\xB3\xF6\x92\x3B\xA5\xDA\x9C\xED\xA1\x6B\x9F\xFA\x43\xE2\x7E\xBC\x0F\xA4\xFB\x9E\xCE\x9B\x24\x98\x3C\x9E\x1B\xA2\x61\x30\xB8\x88\xA8\x10\xAD\x15\xAB\x18\xA0\x63\x98\xAF\x9E\xE2\xA0\x69\x41\xC6\x83\x97\x8F\x9B\x18\xAA\x2C\xA4\x0B\xA0\x4D\x98\x71\x8F\x95\xE3\x58\x88\x9A\xE7\x9A\x22\xAA\x2D\xA6\x5E\xA0\x06\xA3\xF9\xA1\x4B\x44\xDC\x7F\x8D\x11\xBE\xFE\x9F\x44\xA0\xFC\x9D\x14\xA2\xF1\x9F\xD1\x43\xF8\x81\x96\xCE\x9E\x10\x6B\x85\x9B\x71\x91\x99\x66\x35\xA2\xBC\x24\x84\x88\x9D\x06\xBD\x03\xAF\x19\xA5\x03\xA2\x27\x9F\x0F\xA0\x08\x3E\xA1\x80\xB1\xD2\x8D\xAB\x89\xF7\x9F\x2A\x9B\x43\x5C\x40\xA2\x63\x43\xEC\x88\x99\x0E\xA3\x13\xA7\x2F\xA0\x81\xA2\x06\xA2\x4D\xA1\x1C\x44\x9C\x85\x89\x12\xBE\x14\xA4\x19\xA4\x37\x8F\x44\x87\x51\x82\x46\x0A\xA4\x86\x88\x11\xB1\x0E\xAB\x2D\xA6\x55\xA3\x0A\xA2\x58\xA1\xCC\x1E\xB2\x85\x9E\xCC\x82\xF6\x9D\xC5\x96\x48\xA2\xAB\x8F\x1B\x9B\x92\x38\xC4\x6D\x50\x12\xB5\x1C\xA2\x49\xA0\x65\xA2\xCD\x9F\x37\xA2\x96\x44\xDB\x7F\x8C\x04\xAC\x0F\xAC\xF4\x98\x7F\xA3\xD6\xA1\x88\xA0\x5D\x43\x93\x82\xBD\xFB\x85\xFB\x97\xBD\x91\x4F\x8C\x9A\x97\xBE\xA1\xA3\x44\x95\x85\xA8\x02\xBB\x21\xA7\x4A\xA5\x87\xA1\xAC\xA0\xB6\x9C\xB3\x42\x83\x3F\x8F\x10\xA3\x12\x81\x27\xA7\x6C\x9D\xF7\x90\x71\x82\xA6\x31\xDD\x84\x83\x0F\xA9\x26\xA6\x41\xA2\x62\xA1\x25\xA2\xA8\x9E\x2C\x43\xFB\x82\xBD\x08\xAF\x19\xA9\x1D\xA1\x66\xA0\x6D\xA1\xA4\xA1\x87\x3F\xCB\x86\xB0\xF6\x9C\xFD\x98\x1B\x9B\xCE\x9B\x61\x9F\x4E\x83\xD4\x3F\xFE\xBD\x47\x11\xB2\x8E\x84\x55\x93\x90\xA0\x4E\xA1\xD7\xA0\x5E\x31\xBB\x82\xBB\xD3\x87\x1F\xA9\x9B\x99\x7D\xA3\x6E\x9C\x52\x9E\x4E\x1F\xB7\x85\xB9\xC7\x84\xC7\x97\x42\x9F\x28\xA2\xAB\x7F\x4F\x9F\xAA\x43\xDC\x89\xB9\x10\xB7\x20\xAA\x32\xA0\x8E\xA1\x38\xA3\xA1\xA1\x7C\x41\xE4\x89\xBF\x08\xA7\x1A\xA1\x24\xA0\x9D\xA2\x6D\xA0\x75\xA2\x87\x36\xA1\x85\xBF\xB6\x8C\x7B\x9D\x78\x9D\xFF\x9D\x6F\x99\x59\xA2\xCC\x5A\x76\x89\xBA\x05\xB0\x28\xA3\x4E\xA5\x68\xA0\xCC\xA0\x8A\xA2\x32\x43\x96\x8A\x9D\x07\xB2\x1E\xA6\xDC\x9A\x1C\x9C\x09\x9B\xC4\x7C\xFB\x31\xA4\x85\xAE\x41\x7E\x8F\x9D\x46\x6C\x4B\x04\x48\xA3\x22\x7E\x49\x44\xAD\x83\xA7\x9F\x97\x1A\xA1\x12\xA2\x63\x9F\x48\xA0\x8E\x9D\x25\x41\x9E\x76\xAE\x05\xBF\xE1\x94\x4C\xA1\x9D\x96\x4B\xA3\x92\x55\x27\x26\xC4\x10\x85\x91\x9A\x45\x95\x8A\x8C\x67\x9F\x94\x80\x60\x88\xC0\xED\x33\x80\xB0\xCA\x63\x08\x0C\xA2\x91\x88\x74\xE2\x73\x1B\x95\xE7\x7D\x75\xFF\x56\xFF\x71\xB4\x8B\x10\x83\x65\x2E\x85\x05\xFE\x7F\x19\x29\xA4\x18\x9C\xD4\x35\x00\x8C\x2D\x7D\xAB\xA0\x09\x32\x75\x80\xB3\xA6\x67\x15\xB0\x04\x05\x09\x80\x0F\x85\x14\x07\xE0\x9C\x3C\x79\xE0\x00\xC2\xDF\x00\x00\x82\x03\x80\x48\x7C\xB7\x00\x3A\x81\x7D\x80\xC5\x00\x85\x4E\x6B\x6D\x83\x44\x85\x5D\x04\xAD\xA0\x20\x81\xA1\x06\x6F\x45\xD3\x62\x70\x3D\x0E\x5D\x89\x03\x84\xAE\xA1\x31\x8F\x28\x80\x1D\x01\xF9\x00\xB9\x15\xB7\xD7\x7B\x9F\x84\xD3\x06\x5F\xA2\x65\x80\x14\x01\xFD\x2D\xBD\x02\x99\x7D\x35\x02\x86\xB0\xA3\x8F\x8C\xBE\x0E\x66\x45\xE7\x67\x0B\x16\xAC\xDA\x7E\xA0\x84\x08\x81\x2E\x80\xC0\xA2\x92\x45\xCE\x01\xA1\x03\x8D\x02\x86\x59\xA4\x07\x82\x22\x81\xC4\xA2\x8C\x00\xF0\x14\xA0\x04\x9C\xBB\x09\x06\x86\xB1\xA3\x67\xA3\x19\x80\x3C\xA7\x45\xCC\x30\x3D\x16\x07\x84\x73\x51\x0C\x80\xF0\x8E\x27\x95\x76\x45\xD8\x12\x15\x04\x9B\x2C\xAB\x09\x45\xB5\xA0\x49\x81\xD7\xA2\xCB\x00\xD2\x36\x9B\x3A\x26\x08\x8C\x51\x3C\xD5\x8B\x4B\x94\xAD\x94\x1C\x01\xFA\x01\x84\x04\x9C\x2D\xA1\x10\x06\xB8\xA3\x5E\xA3\x07\x85\xB3\x05\x0F\x8B\x9D\x03\x89\x2D\xAC\xB6\x88\x5F\x27\x45\x81\x1E\x69\xA5\x45\xB3\xC9\x58\x16\xA8\x2D\xA6\x0D\x84\xAF\xA3\x6C\x03\x47\x80\xBE\x45\xFD\x8A\x80\x17\xB1\x2C\xAD\xF4\x77\x12\x82\x5C\xA2\xAB\x58\xDD\x28\xD0\x00\xB9\x16\xB5\x2E\x0B\x5B\xA0\xAD\xA2\x59\x68\x24\x85\xD2\x45\x83\x02\x90\xC7\x90\x2B\xAC\x17\x6B\x81\x15\x2B\x81\xDB\xA2\x6A\xAB\x0B\x8E\x19\x16\xB9\x4F\x1C\x5C\xA7\xFF\x7F\x74\x85\xF8\xA2\xA0\x45\xBB\x01\xB4\x17\xA3\x77\x36\x0C\x84\xE6\x50\x30\x80\x0B\x80\xDC\x45\x8C\x02\xB5\x45\x70\x2F\xA3\x5E\xA7\x24\x81\x8D", "\xA0\xDE\x85\x4A\x00\x83\x8B\x91\x9A\x6C\x5C\x81\x0C\x87\xB4\xA2\x72\xA3\x95\x85\xFC\x00\xED\x4E\x0C\x18\xBC\x06\x82\x5F\xA2\x55\xA1\x12\x80\xCC\x05\x4B\x00\x91\xCD\x6C\x03\x87\x2E\xA6\x4E\x96\x48\x17\x7E\xA2\x7E\x1F\xFD\x45\xA3\x8C\x8F\x17\xBE\x2C\xAC\x61\xA1\xC0\xA2\x71\x43\x2E\x80\xB3\x45\xF5\x01\xA9\x17\xBD\xE2\x8B\x5E\xA3\xB6\x01\x7B\xA3\x50\x80\x2C\xA0\x1B\x8C\xAF\x03\x9F\x2B\xA0\x5B\xA2\xB8\xA0\x1C\x80\xB8\x07\x0F\x01\xE2\xA2\x41\x19\xA4\x31\xA5\x50\x90\xB1\xA3\x85\xA2\xC5\xA2\xEE\x45\x81\x02\x03\x19\xAB\x31\xA0\x10\x83\xA7\x76\x49\x80\xB7\xA2\x62\x1B\xBB\x8F\x17\x17\xB4\x39\x55\xB0\x83\x1A\x81\x52\x95\xE4\xA2\x77\x45\xCB\x8B\x89\x19\xA4\x58\x8A\x63\xA2\x22\x81\x5B\xA3\xBB\x94\x28\x01\x85\x24\x80\x39\x56\x88\x70\x0E\x06\x33\x97\x13\x94\x25\x5A\x26\x56\x5C\xE1\x54\x5E\x9D\x99\x7C\x58\x97\x8A\x91\x30\x3D\xEF\x7F\x44\x46\xDD\x6C\x96\x15\x08\x22\x34\xFE\x7F\x40\x8F\xBF\x4E\x35\x0E\xE8\xFF\x17\x8B\xB6\xCC\x71\x04\x79\x16\x7C\x99\x85\xF8\x6E\x56\x33\xDA\xD9\x47\x23\x9E\x3D\x0F\x9F\x85\xEB\x04\xCE\xA2\x9A\xA2\x3B\xA3\xC4\xF2\x78\x8C\x83\x9C\x71\xB4\x8A\x2E\x7E\x55\x81\xD9\x33\xB4\x69\x76\x29\x95\x02\x80\x16\x95\x80\x60\xD4\x1E\xB8\x91\x75\x89\xC5\x8D\xBF\xA0\x4C\x81\xBB\xA7\x3F\x51\x90\x55\x79\x96\x91\xED\x50\xB4\xA1\x0E\x45\xE2\x87\xBE\x01\xAC\x1B\xA2\x6C\x9F\xC3\x9A\x8A\x96\xE8\x8E\x71\x3E\xE8\x85\x98\xF1\x67\x7E\x93\xA8\x90\x29\x9E\xA6\xA2\xE6\x34\x9C\x46\xCA\xEA\x6B\x97\x6A\x9A\x12\x52\xA3\x47\xA2\x38\xA2\x97\xA1\x26\x45\xE5\x89\xA8\x14\xA7\x27\xA0\x3D\xA1\x9D\xA1\x7D\x9E\xCB\x9D\xF7\x3D\xC2\x82\xA3\xB6\x87\x34\x9D\x95\x9D\x53\x97\x3B\x9A\xDB\x9D\x13\x3E\xAC\x82\x71\x1A\xB7\xAA\x73\x6B\xA6\x69\x19\xAD\xA2\x62\xA1\x51\x27\xBE\x88\x9A\x12\xA5\xFD\x9A\x48\xA2\xE7\x99\x9A\x77\xF2\x70\x1F\x43\xF5\x72\xB6\xD2\x83\x19\xA4\x6C\x5B\xD9\xA1\x21\x79\x10\x73\xEE\xA0\x4A\x88\x8F\x14\xAA\x1E\xA1\x51\xA1\xD7\xA3\x44\xA2\xE7\xA1\x15\x45\xBD\x8D\x97\x14\xAC\x29\xA3\x18\x93\xC7\x9E\x61\x9D\x36\x99\x88\x39\xBC\x80\x8A\xE6\x90\xE7\x9E\x6D\xA7\xFA\x7E\xA7\xA2\x11\x52\x40\x43\xA5\x7B\x83\xFF\x97\x35\xA7\x1D\xA2\xA2\xA2\x68\xA0\xED\xA0\xA4\x41\xB3\x86\xA6\x06\xB8\x28\xAA\xE0\x8E\x9B\x99\x5F\x51\x87\x5C\xF5\x46\xE1\xFF\x7A\x97\x76\x23\x5A\x53\xA3\x01\x95\x07\x95\xEA\x9D\x6D\x43\xE7\x7D\x94\x09\xBC\xF2\x91\x37\xA6\xCB\x9D\xCD\xA1\x43\xA0\x70\x80\x72\x55\xB3\xD1\x87\x09\x09\x70\xA2\x7C\x5F\xC2\xA2\x63\x52\xE2\x46\xA2\x8D\x85\x12\xA4\x1F\xAE\x23\xA7\xDF\xA2\x39\xA3\xED\xA0\x2A\x45\xC3\x84\xB8\x04\x94\x1B\xA5\xC5\x9B\xD8\xA1\x70\x9D\xC2\x80\x1F\xE1\x67\x81\xB1\xB5\x3D\x38\xAA\x1C\x8D\xD9\xA1\xB8\xA3\x86\xA3\x1C\x28\xF3\x06\xB7\xCC\x93\x3A\x99\x33\x9B\x11\x9F\xCE\x99\x70\x91\x88\x3E\xFC\x81\x9C\x9C\x85\x0A\xA6\x2E\x91\x43\x9C\xE5\xA0\xFE\x56\x34\x47\xF9\x2D\xB6\x1C\xB7\x08\x51\x72\xA1\x81\xA3\xF8\xA0\x52\xA3\x3C\x47\xC3\x6D\xBA\xCC\x85\xB6\x97\x50\x8D\x83\x8E\x10\x9F\xD3\xA1\x83\xB9\x49\x8E\xAE\x5B\x8B\x3A\xAE\x13\x55\xE9\xA3\x25\xA2\xCF\xA1\x99\x44\xA0\x87\x9D\x0A\xA2\x1D\xAC\x3C\x9E\xF5\x88\x51\x9A\xDF\xA1\xDF\xBD\x06\x1C\x81\x0F\xBA\x0D\xA1\xF7\x07\x25\xA1\x6F\x98\xAD\xA3\xB5\xAB\x1F\x8E\xAB\xE1\x0F\x36\xA2\x92\x86\xF2\x93\x33\xA2\x4C\xA0\xD1\x44\xAD\x4E\x93\x13\xB8\x82\x93\xB6\x90\xC1\x96\x80\x9D\x45\x9F\xFA\xCF\x5A\x87\xB7\x07\xB0\x3B\xA3\xBE\x52\xEE\xA0\xAD\xA2\xAF\xA3\xBA\x44\xEB\x83\xB3\x11\xAD\x0F\xA5\x47\xA4\x1E\xA3\x1D\xA2\x7B\xA0\x79\x44\xF3\x83\x9C\xFB\x8E\x84\x0E\xED\x9D\xCC\x64\xE1\xA2\x58\x92\xDA\xE5\x1F\x8D\x81\x0E\xA0\xA0\x9E\xFE\x99\xF2\x9C\xFC\x9F\x78\x9B\x94\x3F\xF3\x7F\x81\x15\xBD\xE1\x93\x54\xA6\x96\x9F\x24\x9E\xC2\x9A\x5B\xEB\x17\x8F\xA9\x59\x99\x3C\xA8\x6F\xA0\xD4\xA1\x2E\xA3\xE4\xA1\x01\x42\xCB\x87\xB3\x0E\xAD\x1E\xA5\x3B\xA7\x79\xA3\x81\xA1\xC8\xA3\x09\x42\xC7\x5D\x7F\xFB\x95\x03\xAE\xA3\x96\xD1\x8B\x72\x72\x90\xA3\x38\x47\xC1\x50\x8F\x1C\xB1\x12\xA5\x6A\xA0\xD8\x9C\x88\x9A\x56\xA2\xDF\x33\xB9\x83\x95\x86\x92\xF8\x99\x19\xA0\x00\x02\xEA\xA3\x3A\x8B\xAC\x47\xCB\x48\x74\x1D\xA1\x78\x96\x77\xA1\x95\xA0\x34\xA3\x55\xA2\x32\x44\xA8\x83\x88\x1D\xBE\x3D\xAC\x75\xA3\x2C\x50\xE2\xA2\xD8\xA3\xB1\x43\xB2\x8F\x8E\x11\xB4\x3D\xA0\x45\xA6\xF6\xA0\x8B\xA0\xDC\xA3\x2E\x42\x92\x7A\x90\xFC\x8D\xBC\x95\x44\xA7\x47\x9D\x42\x01\xE7\xA3\x8A", "\x16\xF7\x8D\x92\x1F\xBF\x3E\xAB\x6F\xA4\xA4\xA0\xAE\xA2\xE6\xA1\x27\x45\xE8\x8D\xA9\x14\xAA\x37\xAB\x52\xA2\x8F\xA3\x77\xA1\xEE\x9A\xD4\x1E\x96\x8F\x9C\x1F\xB7\x30\x7A\x79\xA6\x75\xA2\x40\x9D\x7C\xA1\x3C\x45\xFB\x85\xBE\x14\xA3\x14\xA0\x54\xA1\x71\xA2\x50\xA3\xC5\xA1\xF7\x3F\x94\x75\x94\xFD\x94\x94\x40\x7F\xA4\xC7\x92\xFC\xA2\x86\xA3\xF9\x46\xA7\x7E\x89\x1E\xA6\x11\xAC\x4B\xA2\x1E\xA1\xE3\xA2\x88\xA0\x8F\x47\x92\x82\x93\x11\xB4\x08\xA5\x54\xA5\x3E\xA1\x45\x9E\x84\xA3\x03\x48\xBD\x4C\xB3\x1F\xA1\x3E\xA7\x56\x9A\x08\x96\x30\x9E\xD0\xA3\xF2\x3F\xC5\x79\xBF\x0B\xA6\x14\xA1\x30\xA1\x19\xA3\xD0\x9E\x64\x9D\x69\x2B\x95\x90\xBC\x8D\x5D\x3E\xA2\x18\x54\xFE\xA3\x7D\x87\x9C\xA0\xC5\x38\xFA\x89\x87\xE3\x93\x38\xA9\xEE\x9D\x34\xA3\xBA\x9F\xC1\xA0\x72\x40\xB3\xE9\x49\xDF\x61\x25\xAD\x6D\xA1\x05\xA7\x05\xA4\xE0\xA3\x19\x48\xD4\x83\xA2\x1C\xA4\xEB\x9D\xC9\x9E\xDC\x9F\x27\x9E\xDB\x9F\xA1\x3C\xFE\x89\xA8\xE7\x80\x28\xAB\x2C\xA1\xF5\x9C\x0F\x76\x58\xA2\x16\xC8\x4A\x8D\x8E\x21\xB1\x3E\xA8\x81\xA6\xF5\xA0\x38\xA3\x29\xA4\x40\x48\xE5\x7A\xB4\xFE\x8E\x1B\xA8\x85\xA0\x6E\xA2\x16\xA5\x1D\x9D\xEB\x43\x8E\x39\x9E\xE9\x8F\x10\x81\xCF\x7A\x07\xA7\x00\x70\x1E\xA4\xA8\xA1\x3E\x90\x99\xB2\x94\x42\xA5\xEE\x9B\x0D\xA6\xC4\xA2\x7E\xA2\xE6\x39\xEF\x90\xA3\xF2\x91\x43\xA3\x41\x96\x19\x9E\x9E\x7E\xDF\x9F\x1B\x02\xD9\x8E\xA3\x21\xAB\x30\x75\x86\xA3\xF3\xA2\x6B\x9B\x3F\xA1\x1B\x3D\x81\x85\x8B\x20\xBD\x17\xAD\x80\xA3\x06\xA6\xE2\xA1\x1A\xA4\x88\x42\xB8\x76\x8C\xA1\x83\xD9\x93\x8E\x9A\x17\x04\x9D\xA1\xA9\x8F\x28\x3B\xA7\x85\x9C\x1C\xAB\x44\xA6\x59\x75\x11\xA6\x01\xA4\x33\x9D\x90\x48\x85\x80\x92\x22\xB9\xE1\x9F\x53\xA3\x87\x9F\xE8\xA2\x48\x9E\x10\x48\xA8\x82\xB0\x09\xA7\x2A\xA1\x51\x87\xC2\x69\x39\x9D\x50\x9B\x15\xF0\x0F\x85\xB2\x13\xAF\x3F\xA4\x8A\xA4\x00\x72\x29\xA5\xE3\xA1\xFA\x3B\xE0\x8F\x8C\x11\xA2\x3F\xA4\x47\xA4\xFC\xA2\x1D\xA2\xF3\xA3\xB7\x43\xE8\x8F\xB9\x0E\xA5\xFF\x91\xDB\x9E\x1F\xA3\xDD\x8E\xDA\x9E\xFE\x38\xF5\x90\xBD\x22\xA5\x26\x53\x77\xA2\x0F\xA7\x31\x96\x7C\xA2\x8E\x33\xC2\x90\xA5\xE6\x80\x44\xA9\xA3\x9A\x10\xA5\xEE\x9F\x8B\xA3\x3C\xA4\x5F\x43\xA7\xFF\x9A\x8F\x9A\xDC\x98\x7B\xA2\xF1\x4E\x0A\xA0\x59\x34\xBC\x91\xAA\xD4\x75\x18\x51\x85\xA0\x53\xA3\xD7\xA2\x05\xA2\x9F\x43\x8C\x88\xA3\x1D\xAE\x20\xA3\x3A\xA4\x67\x9A\x77\x9F\x53\x7F\x44\x24\xE8\x76\x93\xC8\x9C\x45\x93\x2D\xA6\xD9\x99\x9A\x94\x20\x6E\x1D\x29\xB0\x64\x8C\xBE\x8E\x5F\x93\xD6\x95\x49\xA2\x4D\xA0\x1E\xA2\x29\x3F\x9C\x70\x87\x0B\xB9\x3B\xAB\xC5\x94\xF9\x84\xCB\xA2\x25\x91\xC3\x46\x88\x69\xA7\xDB\x8D\x6C\x99\x7A\x31\x20\xA5\xCB\x9B\x81\xA4\x01\x2C\x85\x92\xA9\x10\xAE\x12\xAD\x4C\xA1\x21\xA5\x71\xA1\x85\xA4\xD8\x47\xCB\x6E\x97\x34\x71\x24\xAB\x94\x8D\x90\x9A\x05\x9F\x82\xA1\x5C\x39\x87\x86\xAC\x52\x8D\x91\x87\xBB\x9A\xC8\x96\x45\xA4\xB2\x9C\x18\x49\x97\x58\xA7\xBB\x93\xD2\x91\x3E\xA6\xE9\xA3\xA8\xA3\x05\xA2\x1E\x39\x8D\x88\x92\x13\xB5\x47\xAD\x74\x9E\x46\x8A\xAC\x95\x5A\x9A\xD8\x43\x92\xF9\x4D\xEF\x96\x28\x8F\x92\xA2\x77\x9D\x4C\xA5\x14\x96\x1A\x49\xDC\x88\x81\x07\xBE\x22\xAD\x18\xA0\x8C\xA3\x63\xA0\x31\xA2\x6E\x2C\xE4\x85\x98\x9C\x8B\xCD\x9E\x6E\xA7\x7B\x9F\xC9\x9B\xF0\x9D\x89\x39\xE3\x77\xAC\x04\x65\x4A\xAD\x98\x9F\x28\xA7\x13\x97\xA4\xA4\xA5\x44\xDD\x88\xA6\xCC\x9E\x16\xAE\x94\xA0\x5C\xA0\x54\xA4\x7C\x98\x64\x44\xD3\x92\xA5\x03\xA6\x95\x32\xD7\x92\xA6\x5F\x5F\x03\x86\x44\x76\x2D\xDF\x69\x84\xDB\x5C\x4A\xAE\x99\x9E\x2B\xA5\x1F\x97\x54\x97\xED\x48\xC3\x85\xB5\x1D\xA5\x5C\x97\xAF\x98\xF9\x9B\x18\xA2\xE5\x9B\x1C\x43\xF1\x72\x98\x78\x9F\x47\xA5\x91\xA5\xDC\x94\x5F\x96\xB0\xA4\x6E\x44\x8D\x8A\xAF\x1E\xB5\x3F\xA4\x6E\xA5\xA4\xA0\xFE\xA2\x5D\xA3\xFA\x47\xBC\x8D\xB7\x1E\xBE\x35\xA8\x95\x9F\x21\xA4\xF1\x96\x94\xA4\x18\x3C\xD2\x1F\xB2\x18\x8A\x78\x99\x9B\x34\x2E\xA4\x6C\x9C\xBB\xA4\x45\x63\x7C\x5D\x80\x23\xAC\xE0\x9B\x81\xA5\x7E\xA1\x07\xA4\x87\xA0\x1F\x48\xEF\x83\x88\x23\xBB\x1F\xAA\x8C\xA5\x7F\xA3\x65\xA4\xC7\xA1\x1C\x35\x90\x87\x8A\xFB\x83\x6E\x83\x98\x5E\x33\xA5\x77\x9C\xD0\xA4\x24\x22\x7D\x5A\x8A\x25\xAA\x21\xAC\x94\xA3\x38\xA1\xF5\xA2\x3B\x90\xB2\x28\xAF\x69\x9B\x02\xA9\xCF\x94\x95\xA6\x22\xA2\xA7\x9F\x9D\x97\x85\x49\xFA\x5D\x87\x26\xB3\x49\xAF\xCC\x9A\xFB\x9E\x30\xA4\x39\xA2\xC4\x48\x8C\x8F\x86", "\x23\xAE\x3C\xAB\x9A\xA2\x8A\xA1\x6B\xA4\x2A\xA2\xBA\x43\xDE\x1F\xB0\xFA\x83\x17\x98\x76\xA4\x7E\x5D\x74\x8D\xB5\xA3\x43\x3C\xEE\x8E\x97\xB3\x87\x7D\x9A\x9C\xA4\xDA\x96\xE3\x96\xF0\xA1\x78\x3C\xE8\x90\x98\x23\xB5\xD1\x9A\x8D\xA7\x36\x9C\x37\xA5\x3F\x9E\x02\x47\xC7\x90\xA0\x23\xB2\xF3\x9A\x9D\xA2\x1C\x56\x85\x9C\x4F\x77\xD7\x43\xB8\x91\xA5\x0A\xA2\x3C\xAF\xDF\x99\x21\x02\x6D\xA4\xEC\x9F\xB8\x49\x90\x48\x3A\x26\xA1\x4B\xAB\x94\xA3\x2C\xA4\x0B\xA3\x17\xA4\xB0\x3C\xC4\x79\xB2\xF2\x8A\x00\xAD\x16\xA1\x16\xA7\x5B\xA0\xF7\x8C\x12\x33\xC3\x2F\x94\x1D\x7F\x4F\xA6\xC7\x98\x2E\x47\xCF\x96\x5B\xA2\xD3\x40\xDF\x89\xA2\xF5\x8A\x4F\xA6\x1D\xA0\x36\xA1\xC9\xA2\xD9\xA0\x27\x47\x81\x8E\xA9\x1C\xB4\x19\xA4\x70\xA5\x3D\x5C\xEA\xA3\xCA\x71\x14\x4A\x98\x79\x96\x28\xB3\x7B\x96\xE4\x96\x11\xA6\x9D\x9D\x38\xA2\xBB\x44\x8B\x8F\xBD\x12\xA9\x4D\xAA\x22\xA5\x3A\xA4\x1E\xA2\xCA\xA4\x92\x47\xD6\x61\xA9\x8C\x84\x4A\xA6\x98\xA6\x3C\xA5\x8B\xA5\x53\xA4\x43\x3A\xD6\x86\x80\x0A\xB8\x1A\xAC\x2F\xA2\x4D\xA2\xBF\xA0\x36\xA1\xDD\x40\xEE\x84\x99\xE6\x8A\x3F\xA6\xF6\x9A\xAA\x88\x98\x9C\x75\x98\xD7\xFD\x29\x94\xAA\xF2\x8B\x7C\x9F\xF0\x94\x05\xA6\xB5\x9A\xCF\xA3\xC2\x40\x86\x87\xAD\x22\xAE\xE4\x9F\x8A\xA1\xA4\x9D\xE9\xA3\x19\xA2\xEF\x17\x9A\xC6\x65\xE2\x80\x00\x02\xA5\xA7\x1F\x99\x80\xA5\x87\x29\x88\x49\xBA\x88\x9C\x0B\xBD\x4D\xA4\x96\xA7\x37\xA7\xF9\x91\xE0\xA4\x1E\x38\xAE\x66\xA7\xFE\x99\x85\x53\x87\xA7\xF7\x93\xFF\x8A\x14\xA5\x3D\x4A\x89\x55\xA9\x29\xAC\x28\xAC\x4C\xA4\x4D\xA7\x81\xA4\xC9\x9F\x30\x48\x87\x87\xA2\x1E\xAE\x40\xA4\x7A\xA6\x41\xA4\x51\xA3\x2A\xA2\x74\x33\xDB\x92\xB9\x29\xA4\x55\x9B\xA7\xA6\x9B\xA0\x2E\xA3\x33\xA4\x36\x49\xA3\x8E\x90\x1D\xB3\x8F\x9D\x73\xA6\x2D\x9F\xCF\xA3\x7B\x89\xE0\x41\xD5\x7E\x82\xD1\x81\x08\x05\xA6\xA4\xB7\x9B\x99\xA5\x10\x44\xCC\x49\xB5\x82\xAD\xFF\x80\x06\xA8\xA5\xA5\x70\xA1\xA0\xA5\x2D\xA5\x1F\x3D\xDD\x94\x80\xFD\x8A\x52\xA2\x9D\x9C\x3E\xA1\xC1\x6C\xFB\xA0\xFD\x49\x86\x02\x1D\x2A\xAB\xC7\x9F\xA9\xA7\x1C\x45\xA3\xA4\xCD\xA1\x51\x41\x90\x95\xAF\x23\xAF\x3A\xA8\x93\xA7\x7A\x9E\x4E\xA4\xBD\xA3\x3C\x49\x98\x95\x8B\x08\xBA\xFB\x93\xA0\x5B\x56\xA5\x4A\x9F\x15\xA5\xCB\x49\xA2\x93\xA8\x27\xBA\xE4\x9C\xA1\xA5\x65\xA1\xBF\xA2\x73\xA3\x26\x47\xBB\x8D\xA8\x1C\xBC\x3F\xAA\x72\xA4\xDD\xA1\xE2\x9F\x1C\x96\x4C\x48\xB1\xC8\x64\x29\xAB\x54\xAE\xAC\x97\x56\xA4\x25\xA3\x47\xA5\x1B\x4A\x91\x95\xBC\x21\xA0\x0D\xAF\xA1\xA6\x7C\xA0\xC0\xA2\xF4\xA1\x46\x48\xD7\x84\x88\x21\xB8\x73\x9A\x7C\xA5\x9C\x6A\x96\x84\xD1\x8A\xC7\x44\xDB\x95\xA5\x27\xBA\x53\xA1\xAA\xA0\x47\xA3\x41\xA5\x8E\xA4\x1B\x44\x8A\x92\xBF\x10\xAC\xF9\x91\x44\xA1\x30\xA6\x23\x9D\x3A\xA5\x09\x2F\x9C\x8A\x7C\xBC\x86\x56\xAB\xD3\x9E\xD4\x95\x95\xA5\xBC\xA4\x08\x49\xF9\x95\x9F\x24\xBB\x57\xA8\x2C\xA5\x5F\xA5\x19\xA2\xC5\x5D\x86\x48\xA7\x03\x9C\x09\xA6\x28\xAE\x25\xA7\x3F\x98\x79\xA4\x9F\x97\x2C\x4A\xF8\x92\xA6\x21\xA1\x57\xAB\xAB\xA7\x26\xA5\x3C\xA5\x9C\xA4\xF3\x48\xBB\x92\xA5\x1D\xA2\x43\x99\xB3\x83\xCB\x99\x61\x9F\x4F\xA4\x68\x28\xD3\x7F\x9C\x26\xA2\x52\x34\xB0\xA6\xA9\x9E\xDC\x97\x64\xA5\xE7\x49\xF2\x87\x8B\x26\xBF\x41\xAB\x9E\xA0\xCB\x9D\x7B\xA5\x1B\x9D\xEF\x49\x83\x81\x9E\x23\xA5\x04\xA3\x9F\xA0\xCE\x9A\x46\xA3\xB1\x8F\x7B\x28\xA7\x59\xAB\x2C\xB1\x6B\x3D\xB2\xA0\xAC\x9F\xCB\xA4\x1F\xA5\x1A\x4B\xAE\x94\x8A\xF1\x83\x37\xA1\x7B\xA5\xDC\xA3\x63\xA5\x73\xA3\xB5\x47\xE9\x8D\x93\x26\xAB\x37\xAE\x7F\xA5\xF9\x9C\x2D\xA5\x8D\xA2\xA3\x42\x92\x51\x82\x2C\xA9\x4E\xA8\xB1\xA0\x66\xA7\x8F\xA5\xD1\xA4\x7E\x3E\xA5\x93\xB0\x03\xA7\x4D\xA8\x22\xA4\x46\xA5\xFE\xA0\x1B\xA5\x90\x47\xB8\x94\xB9\x1E\xB6\x5A\xA6\xB6\x9F\x16\x9D\x04\xA1\x98\xA2\x9D\x06\xB4\x8A\x90\x17\x64\x5A\xAC\xAD\xA1\x5C\x96\xB7\xA4\x4B\xA1\x6B\x4A\x86\x94\xA8\x12\xA0\x4E\xAD\x31\x9A\x38\xA7\xA5\xA4\xC6\x98\x1E\x22\xCE\x85\x89\x15\xBA\xEA\x81\x01\xA3\x1F\xA6\xB4\xA1\xC1\xA5\xA1\x1F\xAB\xB4\x40\x43\x01\x25\x94\xBC\x7A\x4A\x5C\xD3\x10\x03\x95\xA9\x2F\xC3\xD1\x72\xBE\x9B\x38\xA7\xD0\x69\xF8\x9E\xA6\x9C\x9A\xA5\x1D\x4A\xF9\x89\xA5\x0F\xA1\x04\xA9\xB3\xA6\x27\xA3\xCE\xA4\xA0\xA0\x73\x43\xC0\x8D\x8D\x0E\xB1\x48\xA7\x89\x79\x5C\x81\x3D\x64\x7A\x96\xB1\x4A\xBE\xA9\x16\x2E\xB0\xE6\x98\xB9\xA6\x59\xA6\x87\xA4\x7F\xA3\x20\x4A\xD2\x95\xA2\x28\xB4\x56\xA4", "\xA2\xA7\xD7\xA2\xB9\xA0\xEE\x97\xAA\x46\xC0\x64\xAB\x52\x9E\x7C\x80\xDC\x74\x0E\xA3\xE7\x9D\xCA\xA5\xEC\x3F\xA0\x7F\xA2\x2B\xA9\x43\xA5\x85\xA6\x0F\xA7\x15\xA4\x22\xA4\xB7\x3F\x9F\x97\xB2\x0D\xBD\x59\xA7\x6C\xA6\x27\xA7\x5C\x9D\x59\x95\x8B\x40\xA9\x7C\xBB\x48\x94\x3A\x6C\xB8\xA7\x02\xA3\x6E\xA4\x8E\xA4\x7E\x4A\xFB\x96\xAF\x29\xBD\x5B\xA1\xA7\xA1\xF1\x9B\x9C\xA4\xC2\x9C\x47\x17\xEF\x8D\xBD\xF8\x8D\x36\x9B\x33\xA6\xE4\x79\xF5\xA5\x16\x9F\x34\x49\xE9\x93\x83\x2F\xB5\x59\xA3\xFB\x9F\x66\xA6\x96\x9E\xE4\xA5\x59\x48\xE9\x95\xAA\x0F\xAB\x57\xAF\x01\x9D\x69\xA1\x8B\x9C\xD5\xA5\xC1\x4B\xC2\x7F\xAD\x2E\xBC\x37\xAF\xBA\xA0\x5A\xA5\xEC\xA5\xC8\xA4\xD3\x4A\xD3\x96\xBD\x1F\xB9\x51\xAA\xE3\x98\xDE\x91\x6B\x9C\x40\x9C\xE7\x4B\xC2\x7C\xAE\xF8\x9D\xE9\x98\x80\xA3\x48\xA5\x4F\xA2\x56\xA4\x0C\x48\xAE\x91\x84\x2A\xB0\x45\xA8\x89\xA6\xEB\x99\xAA\xA2\x61\xA3\x04\x35\x89\x56\xBD\x2D\x16\xF3\x94\xA5\x88\xB5\x97\x9D\xA1\x5D\xA4\xEB\x47\x2B\x97\x8E\x27\xAC\x4C\xAD\xB4\xA6\x31\xA7\xEC\xA3\xFC\xA3\x51\x4B\xFB\x8F\x82\x30\xB5\x56\xA5\xB5\xA4\x08\x9B\x66\x9F\x8F\x95\xFD\x32\x9F\xDD\x62\xAC\x8A\x3A\x92\xA4\x31\x81\xA4\x9F\x9E\x99\xA5\xBA\x4A\xE2\x96\xBA\x0B\xB6\x1F\xA5\xA4\xA2\x6B\xA3\x91\xA4\xAE\xA1\x49\x4A\xDE\x86\x8B\x29\xA0\x1B\xAD\xE9\x9D\x7D\x74\xEA\xA0\x48\xA1\x21\x4C\xF9\x97\x97\x2E\xBB\x43\xA4\xBC\xA5\x0F\xA6\xFB\xA5\x29\xA1\x9D\x4B\xD5\x84\xB2\x2F\xBF\x27\xA4\x88\xA6\x01\x90\xE8\x9B\x00\x9D\x8A\x3E\xD1\x56\xA2\x22\xA0\x5E\xA0\x00\xA3\x6A\xA3\xE6\xA1\x50\xA3\xEB\x4B\x99\x97\x99\x23\xBB\x5C\xAC\x13\xA1\x8A\xA4\xC5\xA2\xE5\xA5\x16\x47\xA5\x94\x9A\xE5\x95\x4F\xA1\xD5\x7E\xEF\xA1\x16\xA7\x65\x9F\x73\x3C\xE5\x9C\x76\x30\xAF\xF6\x9B\xC0\xA2\x70\xA1\x2A\xA5\x6B\xA0\xAB\x48\x9D\x7A\xA8\x2A\xA9\x00\xAA\xAA\xA5\xFE\x9E\xA1\xA4\xD3\xA3\x80\x32\x91\x94\xB0\x67\x9B\x5A\x73\xC7\xA1\xDE\x9D\x1D\xA6\xCE\xA3\xA4\x4A\xE8\x6A\x88\x28\xAE\x21\xAA\xA0\xA0\x86\xA3\xF1\xA2\x19\xA2\xC6\xA9\x71\x82\xA6\x97\x25\x64\xA5\xF1\x9F\x90\xA7\x23\xA5\x06\xA6\x91\x48\xC4\x94\x93\x22\xA6\x52\xA5\x89\xA0\x49\xA4\xC0\xA0\x56\xA5\x0D\x40\xCF\x1F\x45\x06\xB3\x64\xA2\xC2\xA0\x79\xA0\x09\xA7\xF0\xA3\x4E\x4B\xA7\x98\x90\x26\xA9\x61\xA2\x99\xA7\xFC\xA2\xDA\xA5\xF4\xA3\x9A\x3F\xB8\x79\x9E\x9E\x98\x0C\xA1\x7D\x94\x92\xA4\xD6\x9E\x4B\xA6\x2F\x4A\xCC\x96\xA8\x32\xA6\x61\xA3\x7E\xA0\x85\xA5\xF9\xA2\xA9\xA5\xAE\x4C\xD4\x96\xB0\xE9\x81\x53\xAD\x75\x7F\x94\x9E\x40\x00\x5B\xA6\xD8\x3F\xCB\x95\xAB\xF4\x90\x51\xAA\x78\xA1\x3A\xA7\x8C\xA5\xE9\xA4\x20\x48\xE8\x96\xA2\x20\xB7\x4E\xA4\x82\xA7\xE1\x9D\x93\xA5\xA6\x6F\xED\x47\x95\x79\x84\x0D\x25\x65\xA1\x8C\xA7\x94\xA7\x30\xA5\x54\xA6\xBD\x4C\xAB\x99\xBF\x32\xAA\x61\xA1\xCC\xA3\x80\xA7\xDA\xA4\x46\x82\x9E\x1C\xF8\xBC\x4A\x05\xA0\x00\x08\xCC\xA5\x42\xA6\x32\xA7\xD7\xA1\xBA\x4C\xDF\x99\xBC\x32\xA5\x46\xAE\xCB\xA7\x18\xA4\x30\xA7\x64\xA4\xAF\x4C\xCB\x91\xBF\x1F\xA1\xE8\x99\x37\x95\x72\x71\x3B\xA6\x15\xA5\xEF\x4C\x87\x90\x82\x29\xB9\x64\xAF\xC0\xA2\x8F\xA5\x04\xA6\x2E\xA5\x13\x4C\xDE\x94\xBF\x31\xA3\xF6\x91\x82\x98\x60\xA6\x57\x47\x13\xA4\x72\x4C\xDC\x99\xA4\x26\xAF\x4E\xA1\xA3\xA6\x99\xA6\x07\xA4\x68\xA6\xAA\x49\xF7\x99\xAC\x26\xB9\x67\xAE\x9A\xA0\x9D\xA7\xB0\xA4\x47\xA2\x11\x4D\xCA\x98\xAC\x2E\xAC\x62\xAC\xBE\xA2\x27\xA0\x19\xA7\x7D\xA2\xE7\x4A\xFD\x89\x93\x31\xBB\x42\xA5\xC5\xA6\xF1\x89\xEF\x98\x12\x9B\xBC\x47\x81\x02\x3F\x33\xB3\x52\xA0\xA4\xA5\x9E\x9C\xFD\xA1\xB1\xA5\x32\x4A\x97\x9A\xB5\x33\xB4\x4E\xAA\xD1\xA6\x3A\xA4\x47\xA6\xEC\xA4\x7B\x44\xBD\x66\xB1\x08\xB0\x57\xA6\x68\x7B\xA6\xA6\x33\x9E\x51\xA5\xC2\x4B\x9D\x96\x92\x2A\xBD\x55\xAF\x42\xA7\x57\xA5\x43\xA5\x60\xA5\x80\x4B\xCB\x6B\x84\x52\x9B\x62\xA9\xC4\xA5\x8B\xA6\x01\xA3\x2F\xA6\x33\x4B\xA4\x9A\xA2\x31\xAC\x4F\xA7\xD2\xA3\x08\xA6\x19\xA7\x22\xA4\xF1\x49\xEA\x95\x8C\x2F\xB9\x12\xA1\xB1\xA0\x50\x87\xC4\xA4\x73\xA4\x1B\xA4\x08\x8A\x87\x33\xB2\x68\xA1\xB6\xA4\xA2\xA5\x33\xA6\x70\xA6\xF4\x4C\xE2\x99\xB6\x33\xA4\x67\xA8\xCF\xA2\x98\xA7\x39\xA7\x8C\xA2\x5A\x36\xF4\x67\xAF\x14\xBE\x44\xAB\xA9\x81\xE7\x94\xD5\x8E\x99\xA3\xFB\x69\x46\x9A\xB3\xF3\x89\x5F\xAC\xAC\xA1\x8C\xA6\xEB\xA4\xCD\xA5\xE5\x4A\x9C\x97\xA9\x34\xA1\x44\xAB\xD2\xA0\x0E\xA4\xFD\xA5\xB0\x8F\x3F\x4B\xFA\x50\xB2\x2A\x86\x45\x9A\xFF\x62\x17\xA6", "\x30\x97\x6D\xA6\x22\x4D\xA3\x98\xBB\x2F\xB6\x3F\xAF\xAC\xA7\x69\xA5\xB4\xA4\x00\xA6\xB3\x4B\xAB\x98\xB5\x2E\xAD\x61\xA8\xD7\xA5\x6D\xA4\xC9\x9C\x0B\x92\x1C\x45\xEC\x8E\xA6\x0A\xA0\x6C\xAC\x9C\x32\xB0\xA5\x41\x9E\x5C\xA6\x4B\x4B\xCD\x95\xBC\x2F\xA8\x6C\xA0\xBB\xA6\x5C\xA5\x88\xA4\x74\xA5\x61\x4D\xF3\x97\xA3\x35\xB0\x6C\xA7\xB5\xA1\xF1\x8E\xE0\x6E\xD0\x9E\xA7\x28\x93\x72\x91\x07\x7C\x52\x0E\xDA\xA7\x58\xA5\x40\xA6\x54\xA4\x98\x4C\xAA\x91\x9A\x32\xB0\x60\xA4\x89\xA2\x82\xA6\x25\xA5\x07\xA4\x15\x4C\x91\x90\xA5\x20\xB7\x47\xA1\x8A\x88\xBC\x9E\x91\x80\xC3\xA5\x6F\x45\xA2\x60\x2B\xA4\x3A\x79\x0E\x95\xA3\xFC\x6F\x10\xA0\x62\x5B\xB5\x4A\x9C\x4A\x89\x2D\xB5\x69\xAF\xE2\x99\xB9\xA4\x1E\xA7\xE5\xA6\x06\x4D\xCD\x9B\x88\x34\xAF\x6E\xA5\xA8\xA1\xBA\xA6\x4D\x8D\x0B\xA6\x86\x34\x97\x78\xA4\xDB\x8A\x9B\x6C\xDF\x9B\x2D\xA6\x7F\x9E\xCA\xA5\xD3\x2E\xF4\x95\x8A\x2B\xB8\x61\xAC\xB1\xA2\x87\xA5\x02\xA4\x1E\xA6\x9B\x4C\xBE\x98\x9D\x32\xA0\x62\xAF\xC9\xA2\x88\xA7\x37\xA1\xD7\x9D\x84\x26\xEF\x80\xB2\x37\xA4\x36\xAA\x92\xA4\x77\xA4\xBF\x81\x64\xA3\x1E\xEE\x61\x9B\x89\x30\x51\x59\xA0\xDB\xA3\xBD\x9C\x33\xA6\x0E\xA4\x39\x4D\xA8\x93\x98\x34\xB5\x51\xAD\xD3\xA7\x46\xA6\x5D\xA6\x58\xA6\xD9\x3A\xA5\x7C\x89\xEF\x87\xF1\x94\xAB\x92\x7A\xA4\x59\x8D\x01\x5D\x12\x4E\xDB\x18\x5F\x2D\xA7\x6E\xA1\xA4\xA7\xA6\xA7\x0E\xA6\xB2\xA5\xF7\x43\xE6\x96\xBF\x12\xA1\x41\xA1\x4C\xA3\x04\xA7\x30\xA2\xFC\x6C\x85\x39\xD6\x92\x87\xE6\x98\x4A\xA2\x6F\xA2\x2B\xA6\xC9\x7B\x14\xA7\xB8\x8B\x7B\x9B\x95\x38\xAB\x02\xAE\xE2\xA7\xBF\xA4\x8C\xA7\x1E\xA6\xBE\x44\xBF\x98\x80\x13\xA1\x62\xA2\x4C\xA7\x6B\xA1\x2D\xA0\xFB\xA5\xB8\x3A\xC7\x96\xBA\x37\xB4\x70\xA4\xD8\xA3\x99\xA5\x3C\xA6\xE8\xA4\x70\x4D\xD2\x93\xBB\x34\xB1\x66\xAD\xE1\xA1\x6D\xA7\x87\xA6\x7D\xA6\xC7\x34\xE1\x86\x87\x30\xB0\x76\x80\xE4\xA5\xA3\x47\x8A\xA6\xFE\xA6\x41\x43\xDE\x99\x98\x39\xB3\x67\xAA\xE5\xA2\xAE\xA4\x4F\xA6\xBA\xA6\x1B\x4D\xDF\x9C\x9E\xB4\x50\x6F\xA7\x92\xA3\x1C\xA1\xDC\x8A\x86\x95\x7B\x43\x9B\x95\x88\x2B\xA8\x5A\xAC\xE6\x96\x4A\xA4\xEB\x9B\xF3\xA6\x05\x4D\x87\x80\xBB\x31\xA5\x06\xAC\xDE\xA4\x82\xA4\x28\xA6\x1B\xA4\x5A\x35\xB0\x93\xB7\xDD\x92\x4D\xA6\xB6\x94\x36\xA4\x0D\xA7\xB8\x36\x65\x4E\x95\xB2\x14\x39\xAD\x4E\xA6\xCA\xA3\xB3\xA5\x63\xA5\xFB\xA3\xAA\x4C\xD0\x96\xA3\x33\xAD\x65\xA5\xD7\xA6\x9C\xA4\x88\xA6\x1C\xA7\xA5\x20\x97\x82\xB7\xAC\x83\xCC\x51\xE9\xA3\x40\xA5\x62\xA5\x3E\xA5\x7A\x4B\xCE\x89\x96\x1F\xB8\x3B\xA1\x92\xA3\x4B\x9F\xA1\x9F\x2B\xA6\xB1\x3E\xC5\x6A\x8E\x23\xA5\x3A\xA6\x50\xA2\x3C\xA5\xEA\xA0\x2A\xA5\x5B\x2F\xCA\x96\x96\x38\xB7\x72\xA5\xD1\xA1\xCB\xA7\x33\xA7\x2D\xA7\x19\x4D\xF0\x9C\xBE\x34\xB2\x73\xA0\xD4\xA0\x22\xA7\xAB\x9E\xFB\xA4\x64\x2B\x8C\x9D\xB5\xFA\x83\x85\x9C\xEC\x98\x9E\x9D\xA9\xA7\xBB\xA5\xCB\x44\xF9\x96\xB5\xCC\x9A\x5E\xAB\xAA\x90\x7D\x91\x04\x9E\x39\xA5\x20\x44\x9F\xA0\x43\x32\xB7\xEE\x7F\xEC\xA5\x5E\xA6\x41\xA5\x51\xA5\x83\x43\xA5\x95\x98\x03\xAC\xE4\x93\xE8\xA3\x1B\xA2\x27\xA6\x1A\xA4\x87\x4E\x99\x91\xB0\x05\xA7\x51\xAE\xEC\xA7\x60\xA7\xC6\xA5\x34\xA7\x96\x4E\xA5\x98\x98\x3A\xA1\x67\xAA\xE9\xA3\xAE\xA4\xA7\xA7\x38\xA7\x9E\x4E\xE0\x9C\x8E\x9E\x9B\x3D\xAF\xBB\xA1\xBF\xA4\xA3\xA4\x6F\xA7\x1B\x49\xF7\x95\x99\x2F\xAA\x75\xAC\xB7\xA2\x95\xA2\xDF\xA4\xAA\xA3\xCD\x33\xA6\xEF\x73\x32\xB0\xF5\x8D\x7C\xA5\xDB\xA6\x90\xA7\x2A\xA7\xF0\x4C\xB2\x9B\x9C\x36\xBD\x5F\xAE\xD9\xA7\x7F\xA4\x2B\xA7\x00\xA6\xE5\x4C\xAC\x98\x83\x33\xBD\xD8\x61\xDC\x78\xBC\xA6\xBB\xA6\x5D\xA7\x44\x4E\x97\x9C\xA6\x26\xB9\x70\xA5\xB6\xA3\xC3\xA7\xD9\xA5\x2E\xA7\xD3\x4C\xBF\x9A\x95\x33\xBB\xE6\x9E\xD0\xA0\x9B\xA6\x37\x9E\xA7\xA1\xFE\x4E\xDD\x95\x80\x3C\xB7\x5E\xA2\xF0\xA1\xD5\xA6\x47\xA5\x30\xA2\x20\x49\x87\x9E\xA1\xD8\x83\xE6\x89\xCE\xA6\x61\x4A\xC3\xA7\x49\xA7\x48\x4D\xFA\x97\x9A\x35\xA7\x6C\xA3\xC6\xA1\xB1\xA5\x19\xA7\xC5\xA6\xDD\x48\x8D\x9B\x83\x22\xAF\x6C\xAB\x96\xA6\x54\x9C\x20\x9D\x9F\xA7\x67\x4E\xC3\x9C\xAA\x02\xBC\x75\xAF\xD6\xA4\xCD\xA7\xAF\xA6\x37\xA7\x5C\x4E\xC2\x9D\x9E\x38\xB9\x77\xAD\xD1\xA5\x48\xA1\xCB\xA6\x24\x8D\xA2\xDE\x4A\x34\x9C\x3B\xBF\x78\xA4\xDE\xA4\x81\xA7\x40\xA6\xE5\xA6\x81\x4E\xD9\x81\xA5\x3B\xA8\x1C\xA5\xE8\xA2\xA1\xA6\x7B\xA7\x07\xA5\x12\x48\x8D\x89\x8E\x12\x8B\x67\xA0\xF5\xA3\xBC\xA4\xD8\xA5\x9A\xA4", "\x4A\x4D\xE3\x95\x86\x12\xB6\x42\xA8\x48\xA4\xDA\xA0\x27\xA2\x11\xA0\x9E\x44\xCA\x90\xA0\x12\xA4\x6F\x3A\x90\x4D\xEE\xA5\x9F\xA6\x84\xA5\xF8\x4A\x98\x89\xBA\x2B\xB3\x36\xAE\x41\xA5\xDA\xA2\xE7\x9A\x57\xA5\x22\x44\x91\x71\xA1\x21\xB1\x70\xA4\xF6\xA7\xEE\xA6\xFA\xA5\xBC\xA7\x4D\x4C\xE4\x95\xB5\x36\xAA\x6C\xA7\xDB\xA2\xA5\xA5\x6E\xA6\x2A\xA6\x4C\x4F\xDD\x74\xAD\x2B\xA9\x52\x74\xEA\xA5\xF2\xA4\x8B\xA6\x9B\xA6\x22\x4F\xB8\x9A\x96\x34\xBA\x70\xA0\xEC\xA4\xC3\xA6\xD6\xA6\x2F\xA7\x5C\x4F\xC5\x9D\xAC\x2D\xA3\xEC\x9C\xD9\x98\x57\xA1\x5C\x9F\x5C\x9C\xF8\x33\x94\x96\xA5\x3E\xB9\x75\xA5\xF6\xA6\x8E\xA6\x79\xA6\xC2\xA1\xE3\x4E\xC3\x81\xAB\x3D\xA3\x54\xAD\xF6\xA3\x55\xA6\x81\xA7\x50\xA6\x0D\x39\xE5\x9A\x84\x57\x81\x7F\x71\x8A\xA4\xB5\xA5\x96\x97\x8C\xA5\x87\x4F\xEF\x9D\xBA\x1B\xB1\x77\xAB\xCB\xA3\xDE\xA5\x5C\xA7\x7A\xA7\x6F\x4E\xF7\x9D\x83\x3B\xB1\x7D\xAB\xF2\xA4\x19\xA5\xFE\x9E\x2A\x9A\x8A\x36\xFD\xDF\x56\x36\xBC\x1E\x7F\xFC\xA6\x6B\xA6\xDD\xA7\xD3\xA7\xE5\x4D\xE7\x9E\x80\x3A\xAA\x40\xAC\xDC\xA4\x93\xA6\x73\xA7\x73\xA7\x97\x48\xE9\x9D\x8C\x0E\xB9\xC7\x91\xD9\xA0\x64\x95\x13\x7C\x5F\x96\x68\x4D\x9C\x8B\x6A\x35\xA6\x58\xAC\xFB\xA6\xF2\xA5\x61\xA6\xCC\xA7\x25\x4D\xC1\x90\x9D\x35\xBB\x46\xA8\xF4\xA0\x3E\xA7\x88\xA5\x81\xA3\xD6\x4A\xB3\x9F\x8F\x00\xB2\x13\xA5\xF8\x91\x43\x9E\xDC\xA4\xD5\x96\x5A\x2F\x97\x94\x85\x10\xBB\xB3\x97\xF9\xA6\xBF\xA6\x03\xA6\xF6\xA7\xE9\x4D\xEE\x9F\xAB\x37\xB0\x7F\xA0\xDD\xA2\xFE\xA6\x74\xA6\x6B\xA6\x81\x4B\xDF\x7B\xB0\xD1\x90\x16\xAD\x54\xA3\x6E\xA4\x79\x9F\x98\x01\x16\x65\x3A\x1E\x25\x03\x10\x7D\x91\xB9\xA7\x6F\x42\xE1\x3D\xFA\x43\x1A\x0B\xCD\x8A\x4B\x96\x8A\xE3\x09\xE5\x42\xE7\x07\x39\x00\x16\xA8\x01\x19\xFF\x87\x91\x10\xA6\x86\x8E\xF4\xA3\xEF\x35\x87\x75\xC5\x9F\xE5\xF3\x7B\x62\xAF\xEB\x96\x66\x8F\x00\xAB\xBF\x33\x49\x9D\x23\x78\x27\x40\xD1\x85\x99\x37\xA0\xD7\x1B\xDD\xA6\x11\x63\x0E\xA1\xA1\x72\x10\x4E\x9C\xEA\x3C\x9F\x72\xB8\x93\xD4\x93\xDB\xA1\xC5\x9B\x84\x6E\xC6\xCF\x26\x6E\xBB\x38\xBE\xF1\x9D\xD5\x92\x86\x7F\x5D\x96\x6E\x8D\xAC\x22\xDB\xC7\x7C\xA6\x8A\x74\xA5\x9D\x9A\xD9\xA4\x78\xA4\xC7\x6E\xA8\x29\xC3\xA3\x4D\xA4\x66\x62\xA6\x06\x4B\x0C\xAB\x0B\xA7\xD7\x81\xF8\x49\xAD\x82\xA7\x8B\x8D\x83\xA3\xD4\x5D\x31\x83\x16\x51\x63\x9F\x70\x3D\xFC\x29\xA3\xDE\x8A\x6D\xAC\x9F\xA4\x0D\x75\xE5\xA3\x1A\x5F\xEC\x4E\x8E\xCC\x02\x84\x9D\xDE\x7B\x7E\xA1\x53\x84\x6A\xA0\x42\xA8\xD7\x4C\xFE\x75\xBF\x03\x19\x66\xA9\x21\x64\x39\xA2\xCA\x7F\x23\x9C\xFE\x2B\xE8\xEB\x49\x42\xA7\xD5\x50\xD1\xA2\x3B\x89\x1B\x9D\xD5\x99\x89\xF1\x2F\x5F\x40\x41\xB3\x89\x8E\x10\x98\xC7\x36\x52\x9E\xB9\x7A\x9D\x50\x8F\x38\xAB\xFE\x81\xBB\x9B\x3D\x90\xD9\x9F\x59\xA6\xFD\xA4\xE5\x04\xB0\x53\x84\xD1\x34\x7D\xAB\x28\xA7\x51\x54\xCA\xA4\x3A\x9B\xF0\x44\xF4\xA0\xA6\xD3\x4A\x14\xA2\x27\xA1\xFC\xA4\x27\x88\x59\xA8\xEE\xB4\x4D\x91\xB9\x41\xB5\xD5\x89\xB5\xA5\xB6\x9C\x2E\xA9\x4E\x6E\xBD\x4D\xB2\x21\xB2\x57\x9B\x15\xAB\xB6\x9E\xD5\x53\x24\xA9\x9E\x46\x47\x50\xFA\xFD\x6E\xB3\x8E\xA3\x9B\x04\xAC\x77\x39\x0A\xA8\x2D\x48\xDE\x4D\xAE\x72\xA3\x39\xBA\xCC\x6E\x06\xA2\x03\x62\x8A\x99\xD2\xA5\x9C\x14\xE2\x86\x89\xFF\x62\x5D\xA3\x3D\xA4\x74\xA5\xBE\x80\x07\xA7\x2B\x17\xAB\x40\xBE\x47\x95\x35\x92\xE2\xA7\x27\xA6\xF2\x9C\x2B\xA8\x8C\x40\xE5\x19\xA4\x43\xB5\x4A\xAC\x42\x45\x98\x64\x8F\xA6\x6D\x68\x70\x32\xBF\x16\x85\x3F\x76\x05\xA9\x0B\xA9\xAE\x37\x3A\xA8\x03\xA6\x07\x3C\x91\x27\xB4\x39\xA8\x15\x90\x9C\x9C\x1C\xA1\x07\xA6\x3C\x9F\x1F\x4C\xAC\xCD\x6F\x3A\xB4\xCE\x9F\x92\x87\xEF\xA3\x37\x7C\x55\xA8\xE6\x65\x77\xA1\xAB\xE7\x96\x59\x9A\x50\x88\x1C\x7D\xEA\x32\x03\x88\x59\x30\xDD\x3C\xB2\x3A\xBB\x85\xAD\x05\x9F\x3A\x9E\xF0\xA0\x8E\x62\xCB\x69\x10\xA2\xBD\x1D\xBD\xC7\x7F\x9D\x8E\x7A\xA2\x1C\xA9\x0C\x9D\x7D\x50\xC0\xA1\x87\xB8\x62\x64\xAC\xB7\x91\x66\x84\x09\x68\x4A\x9E\x84\x50\xC7\x2A\xBC\x3B\xB5\x2E\x3D\x4A\xA7\xEB\xA4\x53\x7C\x9F\x99\xB4\x4C\x9F\x89\x8F\xCF\x7C\x87\x93\x0E\xAE\xD8\x99\x33\x82\x8F\x77\x92\xCA\x3E\x80\x87\x60\x8F\x74\x9E\x5D\x9E\x24\xA8\x88\x6F\xF7\x9A\xBB\x99\x07\x5E\xAE\x44\xB0\xF7\x81\xF6\xA6\x28\x9A\x3C\xA9\x9D\xA8\x97\x50\x86\x50\x90\x50\x82\xB1\x9E\x21\xA1\x5B\xA5\x36\x87\xE4\xA3\x85\x50\xCB\x8F\xA0\x21\xA0\xCF\x42\x14\xAB\xF4\xA5\xF8\x98\x87\xA8\x09\x51\xA1\x68", "\xA1\xC6\x8D\xA0\x9D\x89\xA6\x65\x5C\xEE\xA7\x3B\x96\xDA\x44\x98\xA2\x8F\x44\xBA\x8A\xA3\x3F\x9C\x2B\xAB\x5E\xA7\x92\x9D\x5A\x50\xA0\x91\xAA\x2C\xA2\x8B\xA9\x15\xA8\x54\xA1\x30\xA8\x91\x8E\x93\x4D\xC2\x96\xAC\x45\xB9\x4D\x33\xAA\x72\x1C\xA6\xED\xA7\xF3\x98\xF8\x4F\xA8\xA1\xB8\x87\x9E\x28\xAA\x2D\x7E\x56\xA2\x2E\xA9\x71\xA4\x30\x45\xE5\x91\xBA\x45\xA0\x5E\x5F\x00\xA9\x0E\x69\x55\xA9\xA8\xA8\x67\x6C\x78\x91\x96\x37\xA9\x49\x76\x44\x96\xC4\x93\x09\xA8\x1F\x01\xCF\x50\x88\x46\x51\x43\xB9\x34\xAA\x0D\xAB\x39\x35\x49\x97\x7D\xA8\x0E\x3E\xD7\xA1\x83\x77\x93\x48\xA9\xA6\x96\x32\xAA\x82\x9E\x0A\xA2\x25\x49\xF9\x6D\xB1\x37\xB8\x4C\xA3\xDF\xA6\x2B\x9E\x4A\x96\x64\xA3\xE2\x50\xB5\xE7\x4F\x3E\xAA\x06\xAE\x31\xA3\xC4\xA6\x22\xA1\xE5\x9D\x44\x0F\x4A\xAD\x53\xE9\x6B\x8D\xA1\x29\x9E\x7B\x9D\x3B\xA8\x4C\x74\xF1\x46\xF0\xA1\xB3\x1B\xAD\x7E\x64\x1B\xA8\x42\xA6\xC1\xA3\x04\x77\xE5\x0C\xBD\xA3\x84\x31\xA3\x4C\xA5\x19\xA9\xF5\x33\x65\xA8\xCB\xA4\x2E\x4C\x99\x98\xAF\x1C\xB4\x7E\x81\x06\xA9\xB5\x95\x1C\x68\xE1\xA8\xA3\x4B\xC7\x9D\xAE\x24\x8B\xCD\x83\x74\xA2\xB6\x9E\xC7\x92\xA3\xA3\x58\x51\xD4\xDA\x4A\xDE\x92\xA9\x9C\x06\xAC\x30\x7E\x76\xA9\xEF\xA5\x00\x93\x2A\x82\xB0\x41\xB6\x7F\xA1\x39\xA3\x30\xA9\xD2\x93\x74\x7C\xDF\x51\xA0\x88\x9D\x67\x9C\x88\xA4\xE7\x8A\xFF\x9D\x7E\xA4\x99\xA2\xF8\x21\xA1\xA2\x80\xAB\x3B\x3B\xA4\xE8\x8A\xAE\x9A\xA1\x8F\xF9\x88\x50\x4D\x83\x6B\xBA\x40\xB6\x60\x7F\x14\xAB\x64\xA5\x80\x5D\x95\xA8\x1E\xF3\x79\xA3\xA6\xC3\x89\xEA\x9C\x7C\xA6\x27\xA8\xDF\x6E\xD4\xA0\x9E\x51\xE0\xA3\x83\x11\xAF\xE0\x89\xCD\xA0\x90\x0A\x80\xA9\x1B\xA4\x3D\x4F\xBB\x33\x50\x47\xA6\xC2\x9D\x03\xAB\x88\x86\x7F\xA8\x7B\xA4\xB6\x3A\x95\xA1\x82\xE5\x77\x90\xA1\x12\x9A\x75\x9A\x52\xA8\xDE\xA8\xDB\x51\xCD\xA2\x84\x3E\xB3\x5C\x53\x21\xAC\xE5\xA6\x55\xA9\x0C\x82\x43\x4D\x9D\x7F\xB3\xE2\x65\x91\xA1\xD4\xA7\x24\x7C\xFD\x56\xF7\x5E\xCF\x51\x8C\x76\x95\x13\xAE\x5B\xAE\x15\xA8\x9B\xA3\x97\x9B\xB0\xA8\xE8\x51\xC2\xD4\x2C\x48\xBA\xA1\x9F\xF4\x88\x30\xA8\x5F\xA6\x08\x9A\x7E\x4D\xCD\x9F\x81\x44\xBD\x7F\x6F\x20\xAB\x16\xA6\x69\xA7\xAE\xA8\x4E\x45\xA6\x68\xBE\xEC\x88\xD5\x8E\x1D\xAA\x47\xAA\x8C\xA9\xB7\xA8\x31\x4C\x8E\x77\x7D\x42\xB1\x46\xA9\x23\xAC\x5C\x77\x93\xA9\x23\xA9\x67\x51\xE8\x76\xB0\x2D\xA8\x85\x8F\x00\xAD\xF0\x87\x8E\xA9\xAD\x9E\x43\x51\xD9\x69\x49\x43\xB4\x12\x8B\x0C\xAA\x70\x9D\x0A\xA0\xC2\x9D\x83\x09\x11\xA3\xA2\xA1\x53\x8C\xA6\xF1\x41\x2F\x81\xEA\x33\xE1\xA4\x7A\x96\x18\xA3\x96\x31\xAB\x70\xA2\x91\xA6\xD5\xA2\x36\xA9\x38\x68\x70\x52\x80\x6A\xB7\x2E\xA2\xA8\x98\xC1\xA3\xDC\x98\x83\xA6\x54\x6B\x2B\x49\xBD\x97\x84\xC9\x8D\x80\x80\x98\xA7\x61\xA4\xAC\x94\xE7\xA5\x5F\x19\xE7\xA1\x81\x25\xB9\x92\x93\xBD\xA1\x41\x81\x6E\x35\x3C\xA9\xA1\x4F\xC9\x7E\x5E\x02\xAB\x80\x90\x0A\xA1\x28\xA6\x28\xA1\x00\xA9\x85\x52\xEA\x92\x8D\xE4\x50\x72\xA4\x1B\x89\x2D\xA7\xB6\x94\x97\xA6\x4E\x37\xE9\x54\xB8\x49\xAA\x0C\x85\x0D\xA9\x3C\xAA\x9D\xA7\x0C\x9E\x2B\x1E\xF9\x9C\xA1\x07\x52\xE0\x99\x1C\xA0\xC7\x8E\xD0\xA2\x83\xA8\xC1\x2D\xD5\xA4\xBB\xA7\x30\x94\xAB\xDB\xA5\x63\xA3\x42\xA8\x51\xA7\x0D\x51\xE8\x1F\xAF\x49\xBF\x5B\xA6\xE0\x91\x22\xA8\xD1\x93\x59\xA7\xD7\x51\xB5\x9D\xBF\x08\x8F\x94\xAC\x2B\xAC\x42\x9D\x1B\x9F\xFB\xA4\xE4\x51\xB3\x93\x8C\x3B\xB1\x63\xA5\x3B\x7C\x56\xAA\x1A\xA7\x3A\x63\xED\x43\xB3\xF1\x4E\x4B\xA9\x80\xA4\x39\x5C\x92\x9F\x72\x35\x69\xA9\xA4\x4D\xB5\x45\x7B\x28\xB5\x82\x8E\xBD\xA0\x84\xA3\x82\xA8\x6A\x4F\x05\x52\x9B\xA4\x88\x07\xBA\x87\x98\x03\x6C\x26\xA8\x11\x88\x21\x35\xD8\x52\x84\x98\xB1\x32\xB7\x89\xAD\x1D\x87\x4E\xA7\x94\x7D\x74\xA9\x77\x4D\x80\x9D\x4E\x42\xAA\xFE\x78\xED\xA1\x39\xA3\xD6\x6C\x4D\xA5\x8E\xA0\x52\x92\x9F\x4A\xAD\x68\xA7\x22\xAB\x26\x40\xAC\xA4\x4C\xA9\xE3\x52\x86\xA5\x8C\x47\xA9\x8A\xA6\xD2\x9F\x5D\xA9\xB1\xA9\xDA\xA8\x2F\x4D\x9B\xA1\x8C\x40\x7E\x94\xAD\x88\x9D\x0B\xA6\x2B\xA2\x4F\xA8\x92\x4F\xC5\x54\x8C\x4C\xB0\xCB\x9F\xAF\xA5\x5F\xA8\x1D\xA5\xCF\x80\xBB\x52\x88\x9E\x94\x13\xB9\x6B\xA6\x16\xA8\xB9\x9E\xFD\x98\x58\x50\x37\x52\xBA\x9F\xBA\x4A\xA6\x2F\x30\x2F\xAF\xD3\xA5\x4B\xA2\x91\x9D\x84\x3D\xCB\x43\xAE\x13\xAF\x1F\x90\x1F\xA9\x8D\x5B\xB0\xA8\x74\xA9\x07\x53\xC6\xA4\xB4\x42\xB6\x26\xA8\x54\xA5\x80\x91\x41\xA3\xFC\xA7\x55\x2F\xDF\x25\x9D\x4B\xA9\x0E", "\xAB\x51\x96\x3D\xAB\xFD\xA7\x05\x84\x19\x3A\xFC\xA2\xA9\xC4\x2C\x95\xAE\xAF\xA7\x3E\x9A\x5D\xA9\x81\xA2\x6F\x4B\x82\xA3\xAD\x4C\xA7\x47\xAC\x2B\xA7\xC8\x3E\xBE\xA9\x86\xA9\xFC\x52\x88\xA3\x9C\x30\x62\x5C\xAF\x18\xAA\xA9\xA2\x3E\xA4\x66\xA8\x67\x52\xE1\x5E\x4D\x41\xBA\x0D\x5C\x26\xA8\xE9\x07\xE4\xA4\x5B\x89\x3E\x47\x8B\x04\xA5\x4A\xB3\x44\x8A\xCC\x69\x47\x93\xE9\xA4\x0E\x79\x1B\x42\xE8\x64\xA3\x4D\xB7\x11\x93\xBB\x98\x61\xA2\x60\xA5\xA8\x8C\x83\x52\xAB\xA5\xA1\x4D\xBB\x79\xA3\x94\x80\x79\x9E\x39\xA8\x12\xA7\xD1\x4B\xB1\xA3\x8C\xD9\x75\xAA\x89\x36\xAD\xBF\x99\x87\xA1\x49\xA9\x3C\x3E\xB9\x86\x96\x4A\xA5\x5F\xA5\x01\x8C\xD8\x98\xDD\xA8\xCB\x86\xF4\x50\xB5\x22\x71\x10\xA2\x49\xAF\x37\xAB\x19\xA2\x36\xA9\xC2\x87\x7D\x53\xEE\x6F\xAB\x4D\xAC\xA7\x8A\x99\xA6\x9D\x8A\x2A\x89\xDC\x34\x91\x53\xA2\x7A\x83\x44\xA2\x8F\xA1\x9B\xA1\x0E\xA9\x79\xA9\xA5\xA9\x51\xD7\x18\xA6\xA6\x97\x39\x9C\xAF\xA5\xA5\x71\xAA\x71\xA5\xEE\xA8\xF3\x0F\xA9\xCF\x24\x4E\xAB\x68\xAB\x39\xAC\x0C\xA9\xE8\x9A\x33\xA8\x1E\x35\xAA\x9B\xB6\x3A\xAF\xA6\x8F\xC8\xA4\x71\xAB\xD5\x93\xDB\x9B\xD5\x43\xBE\xA6\x9F\x4E\xBD\x34\x82\x1F\xAD\xAD\x71\xED\xA8\x57\xA7\xBA\xCD\x7B\x56\x9E\x38\x99\x7D\x8B\x9F\x33\x75\xAB\xDB\xA7\x43\xA5\x1C\xBE\x01\xA1\x9C\x4B\xBA\x04\xA1\x33\xAE\xDF\x9F\xB6\xA9\x33\x88\xC6\x53\x9E\xA0\xB2\x22\xAB\x97\xA8\x30\x8B\x84\xA1\x98\x61\xE8\xA9\xC7\x4F\xE6\x88\x44\x33\xA8\x9B\xA9\x2C\xA2\x53\xA9\xC5\xA8\xA9\xA9\xFB\xDE\x59\x99\xB1\x41\x78\x9E\xAD\xE4\xA3\x88\xA7\x10\x6D\x69\x8F\xEA\x4C\x84\xA5\x86\x4E\xA8\x3E\xA6\xC7\x73\x95\x8D\x78\xA0\x25\x89\x73\x53\xEC\xA7\xA9\x69\x8C\x16\xA8\xEB\x95\x28\xA9\x59\x90\xE2\xA9\xCC\x69\x64\xA7\xB6\x38\xAE\x72\xA6\x84\x9C\xB1\x8A\x54\x80\x21\x35\xFA\x53\xD4\x99\xB7\x38\xB6\xE9\x92\x22\xAC\x23\x08\xF7\xA8\x87\xA5\xDE\x53\x8E\xA6\xA1\x49\xAF\x25\xA9\x22\xAF\xE3\x8D\xBE\x89\xF8\xA9\x90\x4C\xD0\xA2\x87\x43\xA7\x12\xA7\x39\xA8\x80\xA9\xF7\xA9\x7D\xA9\x10\x4B\xEC\x89\x9D\xA9\x68\x44\xA2\x85\x93\x7B\x71\x9E\x89\xA9\xA3\x87\x53\x92\x35\xBD\x48\xB7\x8B\xA0\xFD\x9E\x64\x9F\xA5\x8D\x0C\x9D\xF1\x44\xBB\x47\x4B\x4E\xA0\x9E\xAE\x17\xAF\xFB\xA5\xD1\x92\x5B\xA8\xEA\x3F\x95\xA8\xB1\xB5\x21\xA0\xAA\xF2\xA3\x80\xAA\xF7\xA7\xFA\xA7\x51\x52\xBF\xA6\x98\x90\x86\x8F\xA0\xCC\x93\x48\xAB\x07\xAA\x08\xAA\xB6\x53\xAD\xA8\xB8\x50\xB3\xC4\x83\x0C\xA8\xD7\x98\x3A\xA5\xCB\x8A\x98\x53\x97\xA8\x90\x4D\xA8\xFD\x9F\x30\xAE\x24\x9C\xD5\xA8\xE9\x92\x50\x45\x81\xDD\x28\x00\xA2\x30\xAA\xDD\xA2\x4D\xA8\x53\x55\xAE\xA9\x14\x0D\xC9\xF1\x7F\x50\xBC\x57\xAE\xF8\xA7\x33\xAA\x09\xA2\x84\x96\xE7\x42\xFD\xA4\xB6\x0D\xBF\x93\xA4\xDF\xA4\x5D\xA0\xCC\xA2\x9F\x8C\xD3\x50\xDD\x24\x9B\x12\xA4\x3B\xAC\x00\x92\x4E\xA8\xB1\x9F\xE9\x8E\xDF\x50\xAC\x24\x82\x4A\xAD\x49\xA4\x58\x89\x64\xA4\xB0\xA4\x0E\xA9\x24\x37\x88\xA5\xA1\x89\x98\x35\x99\x37\xAD\x98\x37\xDE\xA9\x17\x89\x76\x54\xCF\x9A\xB8\x51\xBC\xF4\x97\x33\xA1\x2D\xAB\xF8\xA5\x06\x98\x84\x53\xAC\x25\x8D\x2C\xBD\xA2\xA0\x1E\xAE\x9B\x66\xCF\x80\x94\x7D\x8B\x54\xFF\x9E\x8B\x12\xB7\x36\xA9\xE5\x42\xE3\xA0\xED\xA9\x35\xAA\xF4\x48\xED\x80\xAE\x51\xA7\x69\x98\xD2\x83\x39\xAA\xDE\xA0\xA3\x89\xA9\x67\x0C\x92\x9D\xCF\x94\x8F\xAC\xC2\x88\xD6\xA7\xAB\xA9\x37\xA6\x8E\x4E\xA9\xA7\xA6\x97\x22\xA5\xAA\xBD\x9D\x56\xA0\x53\xA9\x9A\x95\xB8\x52\xBD\x41\x87\x31\xB4\xCF\x7E\xD4\xA3\x94\xA9\x91\xA9\xA1\x9A\xBE\x52\xB2\x7D\x94\x44\xBB\x05\x91\x3B\xA9\x3C\xA4\x28\xAB\x55\xAA\xAD\x4E\x86\x7D\xB7\x4E\xBB\x88\xA5\x3C\x85\x23\xAA\xEE\xA8\x65\xA9\xFF\x32\xFC\x45\xBE\x9E\x2D\x7C\xA2\x49\xAE\xDA\xA1\xD6\x74\xE1\xA9\xAB\x12\xC9\x1F\x9C\x51\xAD\xA6\xAF\x25\xAD\x5A\xAA\xF2\xA9\x33\x88\xAC\x54\xDD\x7C\xAE\x52\xB9\x80\x82\x10\x93\x8B\xA9\x24\xAA\x36\xAA\x9D\x44\xB9\x47\x8A\x3C\xA7\xAD\x9C\xF0\xA7\x5C\xA9\x5C\x37\x6C\xAA\x15\x47\xAE\x4E\xA8\x06\xBE\xA6\xA8\x4E\xA8\x8D\xA7\x36\xAB\xD4\x6A\xA1\x50\xB1\x7E\xAF\x3C\xA3\x22\x4C\x4C\xA8\x9C\xA8\xE0\xA6\x1E\x8D\xCB\xE9\x56\x88\x8D\x99\x40\x22\xAC\x48\xA8\x84\xA3\xBD\xA8\x9C\x8A\x98\x54\xA2\x96\x9F\x0A\xA9\x78\xA6\xC7\x8F\x5F\xA8\xD8\xA9\x69\xAA\xF6\x54\x93\xA9\xA6\xF8\x73\xB0\x98\x09\xAC\x33\x78\x3F\xAA\x6A\xAA\x21\x52\x8A\x7F\x9B\xEB\x8D\xAC\x81\x48\xAE\x96\xAB\x20\xAA\xC8\xA7\xB2\x4C\x9C\x7F\x8E\x50\xAC\x12\x85\x51\xAD\x95", "\xA8\x29\xAB\x5B\x8E\xC5\x44\xA4\x71\xB8\x5E\x82\x52\x3D\x4E\xAA\xE9\xA7\x37\xA5\x67\xA9\x3E\x4B\x9C\xA6\x9C\x22\xB9\x92\xA7\x4D\xA7\xE3\x95\x36\xA2\x91\xA9\x2F\x13\xC0\xA9\xBA\x3C\xB2\x9F\xAC\x34\x8B\x52\x8F\x2E\xAA\x57\xA8\x7D\x4D\xF5\x84\xBF\x35\xA3\x92\xAE\x74\x88\xA1\xA9\x26\xAB\x81\xAA\x1B\x53\xD8\xA4\x9E\x4C\xA4\x28\xAB\x24\xAD\xA4\x8D\xA1\x89\x50\xAA\xC1\x54\x9C\x84\xA0\x57\x82\xAA\xA2\x2A\xA1\x2F\xA8\xE8\xA8\xFD\xA7\xDB\xE3\x3D\xAA\x9F\x53\xBF\xA9\xA1\x4E\xAC\x64\xA6\x1D\xA9\x56\xA8\xB6\x36\xBA\x85\x86\x51\xAD\x9A\xAC\x51\x36\x02\x8D\x49\xAB\xCF\xA7\x2C\x4D\x91\xA5\x8A\x50\xB6\x98\xA8\x66\x6F\x89\xAB\x53\xA2\x6B\x8D\x57\x53\xE6\xA4\x94\x51\xAC\x82\xA6\x45\xAA\xB4\x54\x16\xAA\xEC\x3E\xC9\xF8\x52\xAA\xBE\x25\xB1\x4A\xA3\x31\xAB\x4F\x97\x00\xA3\x3E\x95\xA2\x51\xF5\x9C\x9E\x43\xA5\x9B\xA0\xDA\x72\x47\x93\x89\x90\xE2\x8B\x42\x6A\x73\xAA\xA8\x25\xB9\x94\xAC\xD3\x87\xAE\xA8\x18\xAA\xDC\xA5\x62\x54\xF3\x7C\xA4\x51\xA6\x8D\xA9\x84\xA2\x94\x99\xDC\xA9\x70\x8A\xA9\x67\x02\xAB\x8A\xCF\x8F\x9A\xA4\x31\xA8\x54\xAA\x1E\xAB\x5B\x93\x4D\xAD\x25\x9C\xBA\x4D\xBE\x6A\x80\x4F\x91\xAE\x36\x64\xAA\x0F\x9A\x94\x55\x9C\x81\xAF\x4D\xB1\x11\x48\x33\xA5\x52\xAB\x60\xA9\x3B\x91\xF4\xED\x4E\xA6\x96\x3B\xA7\x0E\xA4\x34\xAA\x60\xA8\x11\x61\xFA\x9D\x70\x15\xF0\x94\x97\x3B\xBB\x99\xA5\x34\xAC\x15\x7C\xD4\x81\xB8\xAA\x91\x55\xF4\x63\x88\x50\xA5\xAC\xA0\x1A\xA8\xAF\xA9\x18\xAB\xD1\xA8\xA7\x52\x95\xA7\xBD\x6F\x9B\xAD\x86\x5E\x37\xB3\xA8\xFB\x9B\xC9\xA0\xF7\x54\xFC\x8E\xA6\x52\xB2\x04\x98\x4A\xAC\xF0\x8B\x2F\xAB\xDC\x34\xC6\x55\xB3\x79\x88\x57\xAA\xA8\xA1\xF8\xA5\x74\xA3\xD5\xA3\x45\x6A\xB3\x54\xC3\x1A\x81\x56\xBA\xAD\xAD\x4F\xAD\x55\xAB\xD0\x92\x5D\xAA\x3E\x52\xBC\xA9\xB9\xDD\x90\xA3\x64\x5C\xA8\xBA\xA8\x77\xAA\x88\xAA\xE0\x51\xEB\xA3\x85\x53\xAD\x8F\xA4\x74\xA1\x58\xA8\xCE\xA9\xAE\x93\xCC\x52\xAA\xAB\xB2\x56\xAC\xAD\xA5\x2F\xAD\xB6\xAA\x30\x7C\x68\xAA\x00\x55\xDC\x97\xB3\x56\xAB\xD8\x90\x1E\xAA\x03\x89\x7E\xAA\x83\xA7\xDD\x4B\xFC\xAB\xBE\x53\xA2\x08\x92\x57\xAF\xBC\xA9\x42\xAA\x67\xAA\x04\x55\xC4\x62\xA4\x53\xBA\x19\x94\xA5\x37\xFA\xA3\x4C\xAB\xEC\xA3\x34\x44\xA3\x30\xA6\x57\xB5\x54\xAC\x3C\xAA\x63\xA8\xE7\x92\xA9\xA6\xBB\x41\xB9\xA2\x8B\x4C\x93\xAF\xAF\x97\xA1\x60\xA9\x02\xAA\x33\xA2\x73\x33\x89\x30\x94\x54\xBC\xB0\xA4\x57\xAC\xB0\xAB\x12\xAB\x33\xAA\xEE\x53\xF8\xA5\x90\x56\xA5\xAE\xA6\x60\xAC\xAA\xA9\x72\xAB\x5A\x94\x19\x52\xFD\x88\x94\xB0\x97\xA6\x84\x62\xAB\xB0\xAA\x87\xAA\x0C\xAA\x28\x56\xA5\x7A\x8C\x08\xA3\xB1\xAA\x5F\xAC\xBE\xA8\x6D\xAA\xD7\xAA\x34\x18\xB0\x9A\x9E\x55\x8B\xAD\xAD\x61\xAD\xB5\xAB\x87\xAA\x26\xAA\x0B\x54\x90\xA6\x93\x45\xB2\xDD\x7B\x5D\xAC\xC2\xA8\x0D\xAA\x62\xA7\xDD\x4F\xF9\xF0\x64\x55\xA1\x58\xAC\xFF\x66\x02\x8D\x74\xAA\x06\xA5\xD3\x55\x88\xAC\x81\x55\xAC\x85\xA2\x27\xA7\x14\xAB\x53\xAB\xF1\x6D\x55\x56\xB9\xAB\x8E\x59\xAA\xA2\xA5\x59\xAA\x7B\x92\x4D\xAB\xF0\xAA\x38\x55\xC0\xA4\xBA\x54\xA2\x92\xA6\x07\x9B\x3F\x8E\x98\xAA\xA9\xA3\x40\x54\xAC\xA8\x80\x4D\x9F\x8B\xA4\x42\xAD\xFD\x81\x74\x99\x5B\xA4\x5F\x56\xA0\xB8\x6D\x59\xAF\x34\xAB\x9F\x37\xCA\xA9\x1F\xA7\x05\xA0\xC7\x53\x80\x99\x9A\x22\xB2\x8E\xA5\xFB\xA0\x69\xAB\xDA\x97\x29\xA9\xBD\x20\xC2\xA6\x98\x5F\x9D\xB3\xAD\x62\xAA\xA0\xA9\x55\xAA\xB4\x97\x4C\x55\xC4\x3A\xA0\x2B\x9E\xF6\x7F\x5E\xAD\x76\x5C\x57\xAA\xED\xA2\x4D\x56\xF0\xAC\x96\x2A\xB6\xB0\xA0\x63\xAF\xD8\x9A\x59\xAA\x1F\x84\x49\x24\x85\x97\x98\x4D\xAB\xAB\xAE\x0C\xAC\xE7\x06\xCE\x06\xCF\x58\x6F\x55\xF1\x1E\x1F\x4D\xA5\xBB\x81\xD7\x31\x5C\xA1\x71\x9B\x15\xAA\xA0\x28\x93\xA7\xB0\x51\xBC\xAB\xA8\x89\x7E\xAF\xA8\xEA\xA5\x9C\x58\xAD\x56\xE7\x92\x93\x56\xB5\xAB\xAC\x9B\x98\xC1\xA6\xC0\x92\x05\xA7\xA4\x51\x8B\xAB\x86\x1B\xB5\xDD\x93\x07\xA7\xB1\xAA\xE1\x8B\xD4\x33\xAE\x56\xE8\x7A\x9A\x0C\xA6\xB1\xA5\x66\xAA\x4E\x91\xC4\x9B\x6C\xA3\x55\x50\x8B\xA5\xB7\xD2\x89\xD1\x86\x5E\x31\xD9\xAB\xDB\xA1\x65\xAB\x37\x56\xA7\xAC\xA0\x2F\xA0\x9C\xA2\xBE\xA2\x70\xAB\x69\xAB\x4B\xA9\xDA\xF9\x4C\xD3\x16\x5B\xAD\x43\xA8\x6D\xAE\xC8\xA8\x8E\xAB\xB5\x36\x89\x53\xB4\xA9\x91\x1D\xA6\x35\xAB\x3E\xA9\x82\xA9\x3B\x5D\xDB\xAA\x69\x2A\x96\x30\xA3\x5B\xB0\x5F\xAE\x86\xA6\xA4\xA8\xCF\xA5\x95\xA3\xDC\x50\xD9\x93\xA5\xCA\x82\xAE\xA7\x2A\x9A\x0B\x8C\xB2\xAA\x5D", "\xAB\xA0\x55\xBC\xAD\x9C\x21\xBC\xA4\xA1\x11\xAB\x85\x9E\x75\xA8\xDD\x9B\x95\x56\xEF\x9F\x65\x57\xA2\x52\x33\x6F\xAF\xAB\xA5\xF2\xA4\x7B\xAB\xA0\x4B\xB5\xA5\xA3\x56\xB7\xD1\x70\xD2\x7F\x38\xA5\x6A\x97\x3E\x8C\xC7\x37\x8D\xAD\xB7\x51\xA0\xAA\xAA\x5C\xAC\x20\xA8\x16\xA6\xD8\xA9\xE3\x55\x8B\xA9\x73\x4E\xA8\x34\xA2\x6E\xA8\xE0\xAB\x71\xAB\xD0\xAA\xC4\x49\xFC\xA1\x95\xE8\x89\x76\xAE\x39\xA8\x99\xA8\x48\xA8\x65\xAA\x43\x56\x94\x95\x9A\x5A\xB5\xB0\xA1\x42\xAB\xE7\x98\x7E\xAA\x26\xAB\xB9\x56\xB9\x9E\x81\x58\xA5\x99\xAA\xEF\xA4\x76\x58\x25\x9E\xA9\xAA\x0D\x57\x85\xA0\xBA\x2C\xB0\xB8\xAB\xBC\xA0\xA5\xAA\xB0\x5A\x00\xA9\x8B\x56\xA5\xAE\xBA\x5C\xBB\xAF\xAC\x73\xAD\xEB\xA4\xBD\x96\xF0\xA9\x28\x52\x9C\xF1\x14\xA6\x71\x90\x8B\x6E\xAE\xF8\xA3\xA9\xA2\x61\x9F\xA8\x41\xF2\xAD\xA6\x5C\xB2\xAE\xA8\x72\xAB\xE0\xA8\x92\xAB\x29\xAB\x23\x38\xF3\xA9\x8D\x5F\x99\x4D\x31\x74\xAD\xF3\xA4\x63\xA6\xB0\xAA\x8E\x4D\x92\xAE\xA4\xF4\x99\xA7\xA9\xA8\xA5\xB3\xAB\x7E\x35\xB2\xAB\xB2\x4B\xB8\x9B\x87\x40\xB2\x4F\xA6\x74\xAC\x61\x95\x85\xA8\xF2\x8C\x6F\x57\xDB\xAE\x98\x59\xBD\xBA\xAD\xD2\xA1\x6A\xAB\x04\xAB\xB4\x71\x1A\x52\xAD\x30\xA4\x5D\xBA\xBB\xAF\x67\xAD\x41\xA5\xA0\xAA\x86\xA6\xED\x42\xFE\xA7\xAE\x5D\xAA\xBA\xAC\xB0\xA7\xAB\xAB\xDC\xAA\xB1\xA6\x75\x57\xC5\x93\x89\x4C\xB3\xA8\xA7\xA5\x8C\xE1\xA8\xE1\xAB\x84\xA6\xC6\x4F\xE5\xA7\xAD\x2A\xA3\x90\xA0\x23\xA7\x5D\xA6\x8A\xA9\xAE\xAA\xFF\x56\xCB\xAE\xBE\x58\xA2\xB0\xA2\x44\xA1\x9E\xAA\xEA\x9E\x7F\xAB\xD5\x56\x97\xAF\x85\x3F\xBE\x63\xA7\x78\xAD\x5B\x86\xF2\xA7\x2D\xA1\x1C\x54\xE0\x6C\xAC\x61\x81\xBD\xAD\x78\xA9\xA9\xA8\x9A\x98\xD7\xAB\x1A\x54\xFF\xEF\x4C\x3F\xAB\x8B\xA3\x7B\xA9\xF5\xAA\xE8\xAB\x22\xAB\xF5\x55\xAE\xAB\xBD\x4C\xA0\x7F\xA1\xB4\xA3\xD1\x98\xEA\xAB\xC1\xAB\xBF\x57\xA5\xAC\x99\x5B\xAD\xB6\xA9\xBF\x6B\x88\xAA\x47\xA8\x4E\x68\x40\x53\x86\x8A\x8A\x5A\xA4\xB9\xA5\x7C\xA3\x2D\xA0\xAC\xAA\xA5\xAA\x42\x54\xD0\xA4\x84\x51\xA5\x45\x9A\xB6\x9B\x2F\x95\xB5\x8F\xAA\xAB\xD6\x57\xBF\xA7\x82\x53\xBB\x85\x8D\x44\xAA\x65\x0D\x09\xA0\x24\xA8\xE1\x3D\x82\x2C\xA5\x40\xB5\x99\xA0\x45\xAB\xA6\x01\x5B\xAA\x3D\x5B\xA9\x56\xE4\x59\x69\xA9\x98\xB8\xA8\xF3\xA5\xF6\xAB\x83\xAA\x91\xA4\xB2\x56\x8F\x7C\xB8\x88\x9D\xAB\xA7\x36\xA8\x94\x8D\xD8\xA2\x79\xA4\x01\x55\x9B\xAE\xA8\x68\x79\xBF\xAA\x19\xA8\xC2\x9F\x69\xA9\x62\xAB\x74\x54\xC8\x8B\x8C\xA7\x32\x36\xA2\x76\xA1\x00\xAE\x20\xAA\x8E\xAB\xA4\x43\xA9\xD6\x50\x5B\xBC\xA3\xA0\x1B\xAE\x8F\xA8\x67\xAB\xD3\x8B\x1F\x4B\xBE\x95\x9D\x54\xBA\xA6\xAF\x51\xA9\x8F\xA9\x56\x96\x43\xAA\xDE\x56\xAD\xA6\xA8\x56\xBE\xC5\x7B\xA4\x89\x37\x34\x03\xAC\x00\xAC\x7E\x4F\x87\xAC\x95\x53\xAA\x18\x9B\x99\x9D\x46\x8E\x09\xAD\xBB\xA3\x19\x42\x8E\xAF\xB4\x2E\xA8\x80\xA9\x2D\xA8\xE3\xA0\x8D\x42\x4B\xAA\xD4\x57\x99\xB0\x8D\x35\xBB\xC0\xA9\x4E\xAE\x21\xA5\xBE\xAB\x96\xA3\xCA\x51\xFE\xA1\xAB\x5D\xA0\x88\xAB\x67\xAB\x17\x6C\x53\xA7\x46\xA6\xB5\x54\x9E\xAA\xB7\x52\xB1\x8E\xAA\x0F\xA3\x3B\xA4\x73\xAA\x90\xAB\x7B\x50\xC3\x78\x94\x0E\xB4\xBF\xAF\x94\xA1\xF9\xAA\x8D\xAA\x73\xAB\xDA\x56\xFD\x72\x43\x43\x17\xAE\xAB\xEF\x69\xBB\xA9\xE8\x73\x23\xAC\xA1\x47\xB2\x90\x9C\x40\xAD\x6F\xA2\x3D\xA8\xEE\xA4\x13\xAC\xF9\x90\xE6\x32\xAF\xA7\xAD\x5C\xAD\x74\xAE\x12\xA1\x55\x8F\x0B\xAD\x55\xA7\x31\x58\xB6\xAF\xBE\x4D\xA3\xA6\xAB\x72\xAE\x8D\xA4\x14\xAC\x8B\xA8\x7C\x50\xB0\xAE\x85\x17\x22\x52\x37\x82\xA8\x64\xA6\x03\xAC\x8B\xAA\x10\x58\xD7\x2E\x85\x7A\x95\x85\x95\x82\xAC\x0F\xAC\x0C\xAC\x3F\xAB\x98\x57\xAC\xAF\xA5\x61\xA8\x9E\xAB\x2D\x77\x9A\xAB\xD3\x8D\x37\xAC\x05\x4F\x8E\xAC\xBB\x5C\xAD\x9E\xAE\x2E\x77\x49\x9E\x9B\x8C\x1D\xAC\x48\x58\xBC\xB0\xAE\x53\xBD\xC0\xA1\xD5\xA2\xA8\xA6\xD4\xAB\x0D\x82\x82\x57\x86\xB1\xB0\x61\xA8\xC4\xAB\x7A\xA8\xD0\xAB\x22\xAC\x33\x97\xDB\x53\xFE\xAF\x8B\x3E\xAD\xC0\xA9\x82\xAE\xC5\xA8\x75\xAA\x71\xAA\xED\x1C\xB8\xA2\xB0\x60\x65\xC4\xA1\xD7\x35\x0F\xAE\x06\xAD\x3F\xAC\x4A\x58\x97\xAA\xAC\xE1\x81\xB1\xA3\x14\x92\x08\x8E\x79\x32\x5B\xAC\x3B\x58\xB8\xB1\x9C\x60\xAB\xC2\xA4\x21\xA9\x12\xA9\x13\x8C\x4C\xAC\x61\x58\x8B\x94\x85\x5E\xB9\xB2\xAB\x82\xAF\xE9\xAB\xDF\xAB\xFA\xA9\x9B\x10\x23\xBD\x7E\x62\xB0\xC4\xAB\xBD\xA0\xC0\xA8\xD3\xAA\x4A\xAC\xFD\x53\xEE\x70\x8F\x62\xA2\xC5\xA1\x89\xAC\xD5\xA7\xFD\xAA\x39\xAB\x02\x09\xC6", "\x21\xBE\xCE\x9D\xE2\x80\x86\xA9\x06\xA6\x32\xAD\x44\xAC\xA6\x58\xD9\xA7\xAA\x3B\xAC\x52\xA4\x20\xAB\xC9\xA9\xAC\x8F\x55\xAC\x28\x58\xF5\xA9\xAE\x62\xBA\xB2\xA7\x61\xAB\x14\x9F\x8B\xA8\x4A\x8F\xFF\x57\xFE\xB0\xAD\x62\xAE\xB4\xAF\x62\xAE\xF0\x8F\x26\xA5\x94\xA9\xBD\x3F\xB7\x2B\x81\x7D\x9C\xA1\xA2\xF2\x93\x48\xAA\xE3\x8C\x78\xAC\xFA\x58\xF2\xB1\xBC\x63\xAF\xC5\xA4\xB2\xA4\x27\x04\x56\xAB\x39\xA1\x39\x55\xEA\xA2\xBD\x78\x89\xA1\xAF\x85\xA8\x19\xAE\x39\xAC\x47\xA6\x57\x57\xEE\xAD\xB3\x59\xAE\xA1\xA8\xEC\x98\x86\xAA\xA3\xA0\x37\xAC\xDC\x58\xD5\xB1\x92\x62\xB7\xC6\xAC\x69\xAE\x1F\xAC\xA1\xAB\x87\xAC\x3A\xDC\x08\xAD\xAD\xBD\x80\xC9\xA5\x8B\xAF\x10\xAE\xC6\xAB\x07\xAC\x8F\x56\xA6\xB2\x8D\x61\xA8\xFC\x82\x0C\xAC\xFB\xA8\x31\xA8\xEF\xAB\x15\x21\x96\xB2\x82\x2A\xA2\xC3\xA4\xE0\xA0\xDD\xA6\x3A\xAD\xF9\xA7\x26\x52\xD0\xAE\x9C\x15\x83\x93\xA1\x45\xAD\x5D\x42\x5A\xAA\x3B\xAB\x5A\x53\xEF\xAF\x85\xEB\x51\xBF\xAB\x6A\xAA\x74\x8D\xB4\xA2\x97\xAC\x63\x56\xBB\xAB\xB7\xB6\x60\x07\xAD\xE0\x9B\x4E\xA9\xB0\xAB\x3A\xA9\x9D\x3B\x8D\x37\xA9\x9E\x2E\x53\xA5\xED\xA5\xC6\xAB\xAE\xAA\x66\xAB\x76\x55\xBD\xAB\x87\x56\xBC\x93\xA0\x5C\xAB\xAF\xAB\xEE\xA4\x39\xAA\x0F\x4E\xA9\xA3\x87\x7A\x85\xBE\x90\x8C\xA9\x13\xAE\x30\xAD\x1E\xAC\xC4\x58\x84\xA8\xA5\x43\xAF\x5E\xA0\x94\xA7\xB4\xA8\xA3\xA9\x13\xA7\x01\x1F\xC6\x5D\xAD\x65\xA9\xC6\xA8\x91\xAD\xDD\xA9\x10\xAB\x57\xAA\xEC\x50\xA5\xAB\xA8\x05\x9A\x19\xAD\x05\xAF\x12\xAE\x5E\xAC\xA8\xAC\x33\x57\xCF\xAC\x9C\x3F\xB6\xA1\xA3\xC8\x9D\x05\xAF\x61\xA3\x62\xA1\x88\x59\xEC\xAD\xA0\x50\xB4\xA9\xA5\x37\xA9\x5E\x96\x56\xAC\xF3\x32\x5C\x59\x98\x56\x84\x59\xAA\xBE\xA8\x85\xAC\xC4\x8F\x9E\xA9\x70\x9B\x89\x55\xE9\x85\xBB\x6F\x9C\xB7\xAA\xC1\x9E\xA4\x8F\x56\xAC\xBE\xA4\x82\x3E\xA4\xB1\xA3\x61\xA6\x74\xAF\x93\xAF\x03\xA9\x76\xA4\x3B\xA8\x30\x4C\xEF\x78\x9F\x44\xA6\x28\xA4\x39\xA7\x20\xAC\x5B\xAD\xC8\xAC\x56\x57\xFE\xB2\xA0\x63\xB5\xCC\xA1\xEA\xA6\xE2\xAB\x90\xA8\xF5\x8E\x16\x42\xFB\xB2\x97\x64\xA9\xC2\xA3\x8C\xAA\x17\xAD\x4A\xA0\xD7\xA9\x1F\x57\xEB\xB0\x8B\x3B\xB3\x83\xAC\x51\x60\x38\xAF\xB7\xA0\xE1\xAC\x3B\x59\xE7\xB1\xA5\x62\xA6\xBC\xA7\x8A\xA8\xF1\xA8\xB0\xAA\xEA\xA1\xC8\x52\xB9\xA8\xBB\x4E\xAB\xA9\x8A\x87\xAE\xFD\x40\x64\xAD\x51\xAC\x2F\x59\x80\xB1\xB1\x64\xA1\xBE\x84\x12\xAB\x78\xAB\x63\xAD\xA7\xAC\xE0\x59\xD1\xB2\x9D\x57\xB6\xAF\xA6\x29\x54\x92\x9C\x15\xAD\xB2\xA4\xD0\x59\xC3\x9F\xBC\x64\xAB\x72\xA5\xE0\xA2\xF3\xA8\xF2\xA7\x4A\xAC\x3B\x50\xEB\xB2\x81\x67\xB8\xCD\xA1\x7E\xA9\x23\xAF\x5F\xAC\xCC\x8F\x49\x56\xFD\x36\x56\x4F\xB4\xC5\xAB\x9F\x31\x33\xAC\x3A\x9B\xBE\xA7\x0A\x59\x82\xB0\x95\x75\x68\x0D\xA6\x9B\xAB\x3F\xAD\x7A\xAD\xC4\xAC\x64\x56\xA2\xAB\x9F\x4F\xAF\xC6\xAC\x20\xAA\xEC\xAB\x6C\x8D\xC3\xAC\x0F\x5A\x92\xB3\xB1\x59\xA3\xBF\xA2\xED\x89\x42\xAB\x3B\xAD\xDB\xAC\x19\x5A\xB9\xB3\x93\x66\xBA\xC8\xAC\xF3\xA1\xC5\xA8\x3E\xAC\xA4\x99\xF1\x59\x87\x9A\xA9\x2A\xA8\xC7\xA4\x9D\xAD\x35\xAF\xF4\xA9\xE9\xA6\x31\x56\xF6\xA7\xB5\x9F\x87\xCF\xA8\xA1\xAD\x1B\xAD\x1C\xAD\x6F\xAC\x1C\x5A\xA5\xB4\xBA\x58\xA4\x56\xA4\xA3\xA8\x45\xAC\x7F\xAD\xC8\xA0\xD7\x57\xB7\xAF\x8B\xBA\x41\x77\x9A\x30\xAD\x7D\x8C\x7A\xAC\x1B\xAD\xAA\x59\xBD\xB2\xB1\x3F\xAE\xD1\xA6\x86\xA8\x04\xA9\xE7\xAA\xA4\x07\x7C\x31\x95\xCD\x5F\x67\xA8\xD2\xA1\x9E\xA9\x17\xAD\x20\xAC\x90\xAA\x18\x56\xFF\x75\x8D\x67\xA7\xCD\xA2\x1F\x9A\x69\x99\x95\xAD\xE2\xAC\x57\x5A\x9B\x5E\xB3\x48\xA7\x6D\xAD\x52\xAE\xCB\x9A\x2E\x9C\x98\xAA\x02\x1D\xDC\xB4\xBB\x1C\xB2\xB9\xAA\xA1\xAB\xD3\xA9\xCD\xAA\xB2\xA8\x64\xC2\x34\x2B\x83\x55\xBF\x91\xA1\xFD\x9F\x84\xAA\x41\xA2\x8A\xAC\xCE\x59\xF0\xB3\xBF\x68\xA2\x17\xA1\xA4\xAB\x0E\xAD\xF6\xAB\x48\xAB\x40\x4B\xF1\xA2\x86\x5F\xBB\xD2\xA8\x99\xA8\x35\xAC\x86\xA1\x24\xAD\xF4\x59\xBE\xB2\xB6\x67\xA8\x74\xA9\xFC\xA4\x23\xAF\x4D\xAA\x5A\x9F\xA9\x4D\xC3\x78\x93\x5F\xA1\xF5\x87\xA4\xAA\x24\xAE\x37\xAD\x49\xAC\x25\x59\xF2\x67\xA8\x61\xA3\xA1\x93\xA7\xAB\xA9\xA2\x56\xAA\x89\x9C\x47\x54\xF4\x82\x85\x68\xA6\xD4\xA0\x77\xA8\xB4\xA6\xDC\xAB\x19\xAC\x74\x57\xD4\xA5\x9E\x3D\xA0\xBB\xA3\xAD\x8F\xD3\xAA\x0A\xA0\xAB\xA9\x59\x55\xEA\xAF\xA3\xF7\x8D\xBF\xA5\xB2\x02\x29\xAC\x59\x54\xA6\xAC\x19\x1E\xE6\xCB\x3F\x29\xBF\x3C\xA9\xA0\xA4\x2F\xAC\x71\xAC\xB8\xAC\x9A\x54\xC8\xA3\xA9\xC8\x90", "\x03\xAB\x19\xAE\x4E\xA9\x1A\xAA\x64\x8D\xD4\x47\xA4\xB5\xAA\x5E\xAB\xCD\xAE\xF6\xA5\x3A\xAC\x01\xAC\x62\xAD\x06\x58\x8D\xAB\xBF\xDB\x86\xB6\xA8\xD3\x89\x59\xAD\x97\xAD\x8C\xAB\xEA\x59\xE8\xAB\x99\x3B\xAE\x18\x84\x97\x99\xDA\xAA\x5D\xAD\x69\xAB\x20\x1F\x9B\x6C\x86\x68\xA4\xE1\x99\xB1\x90\xF8\xAB\x8F\xAB\x23\xAB\x87\x52\x9F\xB0\xA5\x08\x80\xDF\x9C\x05\xAA\x7C\x9D\x6A\xAB\x70\x8E\xD6\x5A\xEB\xB4\x9E\x69\xB9\xD6\xAA\x82\xAB\x06\x8D\xBA\xAA\xA7\xAC\xAB\x34\xE3\xB5\x9E\x00\xA5\xD7\xAC\x99\xA9\xF8\xA8\xBA\xAD\x6D\xAB\x8E\x53\xC7\xB5\xA2\x70\x91\xD7\xA1\x6C\x98\xFC\xA8\x90\xAC\xF1\xAB\x76\x2E\xCF\xB5\x8B\x38\xBE\xA4\xAE\xDA\x84\xA3\x62\xD5\x8E\x71\xAD\xCA\x5A\xD6\xB0\x9F\x65\xAB\xBE\xA2\xA1\xAF\x8D\xA9\xC1\xAB\x2D\x98\x8F\x5A\xC9\x7D\xAC\x61\xB3\x61\xAF\xE3\x89\x37\x37\xAE\xAD\x2C\xA5\xA7\x4A\xAA\xB4\xBC\x31\xAC\xD1\xAC\x8C\xA9\xA2\xA9\x10\x9E\x86\xA8\xB2\x54\xC5\x3E\xBA\x6A\xB4\x76\xAA\x99\xAE\x2B\xAD\xC0\xAA\xB0\xAC\x29\x57\x99\xA3\x8B\x57\xAE\xCE\x80\x2B\xAE\xD6\x9D\x6A\x97\x87\xAD\x5F\x44\xFA\xB5\x87\x12\xBC\xD7\xA7\x85\xAE\x5F\xAF\xB9\xAA\x53\xA9\x9B\x3D\xC4\x82\x87\x5C\xB2\x61\xAF\x72\xA9\x29\xA3\x34\x8E\x82\xAD\x10\x47\xD5\xAF\x87\x6C\xBE\xCF\xAB\x9B\xA8\x71\xA9\xB4\xA8\x78\xAD\xF9\x5A\x91\xB6\xB6\x5F\xB8\xD4\xAF\xA6\xAC\x82\x77\x7E\xA8\xC1\x7E\x79\x59\x90\xB6\x97\x6B\xBD\x4B\xAF\xA5\xA8\x58\xAD\x98\xAC\xEB\x8B\x48\x57\xA7\x3F\x7B\x25\xBB\xDA\xA9\x9A\xAD\x6B\xAF\x26\xAD\xB8\xAC\x2D\x52\x91\x9F\xB0\x44\xA5\xA7\xAA\x67\xA1\xAE\x37\xC7\xAC\x53\xA5\xBD\x5A\xC3\xB3\x9A\x62\xA4\xBA\xA9\xC6\xA0\xB7\x99\x2A\xAD\x70\xAD\x39\x5B\xD2\xB6\x8C\x3E\xAF\xA8\xA5\xAF\xAA\x41\xAA\xE9\xAB\x17\x92\xD9\x4C\x8D\xB4\xBE\x26\xBA\xDB\xAC\x8A\xA9\x41\xAC\x4C\xAD\x7E\xAC\x1D\x52\xCB\x83\xBA\x53\xB9\xD5\x88\xB4\xAC\xF8\xA2\xC1\xAC\x3E\xAD\x08\x5B\xC2\xB4\xAD\x4F\xBC\x67\xAF\x3E\xAD\x11\x47\xD8\xAC\x79\xAD\xD8\x5A\x90\xB4\x92\x65\xAC\xBE\xAC\xAF\x99\x40\xAF\x9A\x4F\xC0\xAB\x52\x5A\x8D\xB7\xAD\x10\xB1\x38\xA7\xBC\xA6\xE1\xA9\xFC\xA4\xB4\xAB\x4B\x4F\xEA\xAE\x8F\xB4\x97\xF5\x6A\x8D\xAF\x68\xAD\xD4\xAC\xB2\xAD\x87\x5A\xE6\xB6\xB4\x6D\xAF\xA7\xAF\xA5\x8A\x1C\xAE\x90\xAA\x75\x44\x97\x5B\x85\xB6\xAC\x69\xA2\xD1\xAB\xA1\xA8\xFB\xAB\xFC\xA8\x2F\xA4\x14\xC8\x11\xA6\x91\x01\x59\xDD\xA9\xB4\xAF\x71\xAF\xAB\xAB\xC8\xAD\x7E\x5A\xBF\xB7\xA5\x5F\xA7\xBD\xAE\xB0\xA9\xF5\x33\xDB\xAD\xE0\xA7\x5A\x4A\xA2\xB6\x84\x3A\xAC\xD6\xA9\x79\xAB\x7F\xAA\xF9\xA8\xFA\xA7\x2A\x55\x80\xB2\x94\x7C\x71\xBD\xA8\x23\xAB\xEF\x8F\xCA\xAC\x82\xA7\x96\x5A\xB7\xB4\x94\x6D\xB4\xCC\xAA\x31\x8F\xCC\xA9\x9D\xAA\xB4\xA8\xEB\x5A\xC1\xA4\xBC\x5E\xBE\xDE\xAE\xB1\xAC\x65\xAF\x81\xAC\x9E\xAD\x13\x5B\x9D\xB3\x95\x6C\xA6\xB3\xA7\x34\xAF\x77\xA0\x01\x93\x9E\x9D\xC0\x4D\x95\x9B\xAA\x6C\xAD\xDF\xA0\xBE\xAD\x2B\xAD\x8F\xAA\x73\xAD\xA4\x57\xEC\xB3\x99\x70\x6E\xBE\xA7\x4C\xAC\xBC\x88\x34\xA5\x44\xAB\xFB\x5B\xC2\xD4\x0F\x6F\xB9\x63\xA2\xE8\xA2\x7A\xAE\xB9\xA6\x25\xAD\x1D\x50\xCC\xB4\x8C\x62\xBC\x91\xA2\x50\xA6\x7E\xAD\xAE\xA0\x09\xA0\x5B\x55\xC5\xA1\xA9\xD6\x8B\xE0\xA8\xDE\xA5\x81\xAE\x7A\xA7\x15\xAD\xD3\x59\xA5\xB6\xBE\x6D\xB4\x9F\xAE\x44\xAA\x04\xA9\xB3\x9B\xEB\xA6\xA3\x56\xC8\xB2\x95\x51\xA6\xB5\xAA\x31\x50\x57\xAD\x9A\x94\x9C\xAD\x85\x38\xB7\x9E\x95\x61\xB3\xDA\xA4\x92\xA8\xD5\xA2\xB0\xAD\xD8\x9D\xF0\xC8\x0D\x5A\xA6\x4D\xAF\x42\x72\xB0\xAD\x2D\x95\xC2\xA4\xC5\xA7\x0B\x4B\xFB\xB6\xBE\x54\xAB\xC8\xA1\x26\x8B\x93\xAA\x38\xA0\xB3\xAC\x6D\x53\x81\xA5\xA9\x65\xA1\xCB\x9C\x39\x93\xE0\xA6\x0C\xAE\xB3\xA4\x12\x5B\xAF\xB6\x94\x6C\xB1\xD9\xA2\x29\xAF\xB9\x80\x15\xA8\x0A\xAC\xE8\x50\xA6\x9C\xBF\x80\x8A\x1B\x9E\xC4\xAA\x61\xA5\xFD\xAA\x21\xAE\x53\x55\xC4\xB8\x8D\x63\xB8\x38\xAA\x5E\x83\x30\xAF\xE0\xA9\xC2\xAC\xE3\x1E\x89\x9F\xA0\x1D\xA8\xC8\xA7\x8B\xAB\x1F\xAE\x82\xAC\x86\xAC\xF5\x51\xA4\xC1\x47\x1C\xB9\xC9\xAD\xC5\xA8\x88\xAF\x17\xAF\xC2\xAD\x7C\x5B\xF3\xB1\xA3\x71\xB1\xF0\x91\x2A\xAA\x1B\xA8\x0C\xAE\x7A\x9D\xFD\x5B\xAD\xB6\xBF\x6F\xBD\xD7\xA7\xAE\xAC\xB7\xAB\x17\xAA\xD8\x9D\xA4\x32\x94\x7F\x42\x61\xAB\xDD\xA6\x0E\xA3\x48\xA9\xB0\x91\x3A\xAE\x6B\x5C\xC1\xB8\xB8\x71\xA3\xE2\xAF\xC6\xAC\x1E\xAD\xAE\x91\xA0\xA3\x4F\x58\xCA\xB3\xA7\x41\xAB\xA4\x64\x39\xA7\x8F\xAC\xC1\x9D\x27\xAE\x29\x5A\x9F\xB8\xA3\x6C\xA1\xE1\xAC\x77\xAA", "\xAC\xAA\x6D\xAA\xEE\xA8\xFD\xEF\x5E\xB0\x8F\x72\xB6\x79\xAE\xC5\xAB\x86\xAC\x18\xAE\x19\xAC\xA2\x4D\xB4\xB0\xAA\x4B\xA7\xC3\xAB\x3B\xA6\x09\xAC\xCD\xAD\xE6\xAA\xCC\x59\xFC\x9F\x6B\x72\xB3\x76\xA1\xC8\xAF\x7D\xAF\x66\xAD\x9E\xAD\x85\x5C\xD9\xB0\xAA\x57\xB8\x34\x86\x4C\xAD\xBD\xA8\xC2\xAA\x82\xAC\xC0\xB9\x4D\x9D\x90\x7C\x90\xE4\xA0\x8F\xA1\x1F\xAD\x1B\xAE\xC3\xAD\xE2\x59\x88\xB7\xBD\x06\x8F\xDA\xAB\xCC\xAC\x95\xAE\x1D\xAE\x57\xAE\x93\x5C\xE1\xB8\x95\x72\xBB\xE3\xAF\x53\x8E\x11\xAC\x76\x8E\x35\xAE\xCD\x5C\xEC\xB8\x81\x63\xAE\xE3\xA7\xB8\xA8\x8E\xAD\x54\x42\x81\x90\x9E\x5C\xAE\x83\x9B\x35\xB6\x59\xA3\x00\xAE\x3D\xA6\xD0\xAA\xCF\xA5\xB3\x5B\x9C\xB1\x98\x54\xA4\x96\x83\xA0\xAA\x3F\xAC\x20\xAE\x50\xAE\x7B\x5A\xC7\xB7\x8C\x6D\xA0\x45\x98\x1A\xA1\x9D\xAF\x4E\xA3\x0B\xA8\x00\x4E\xED\x9F\x82\x38\xAF\x7F\xA0\xC1\xAC\x0C\xAE\x04\xAE\x41\xAB\x2F\x42\xF6\xB1\xB7\x39\x8E\x97\xA5\xCD\xAC\x97\xAC\x3E\xAF\x10\xAD\xFD\x59\xBA\xB3\xB9\x68\xA8\x8A\xAC\x8B\xA8\xD2\x94\xC8\x45\x1F\xAE\x91\x5C\xF7\xB8\xB1\x63\xB9\xE3\xA2\xC6\xAF\x65\x98\x50\xA8\xC6\x91\xCC\x5C\xBC\x95\xBA\x64\xB2\xCF\xA2\x9D\xAC\x7A\xAE\x22\xAD\x83\xAE\xD6\x59\x9D\xB7\xAC\x6A\xA0\x7B\xA1\x8D\xAA\xEC\xA7\x45\xAE\x70\xAE\x22\x5D\xCE\xB9\xA3\x73\xB0\xE6\xA6\xA5\xAB\x3C\xAE\xB0\xA5\x1D\xAD\x20\x4D\xE9\xB8\xA1\x74\xBE\x58\xA2\xD3\xAE\x2D\xAC\x39\xAF\x68\xAE\xE6\x5C\xBD\x92\x82\x3E\xBB\xF1\x75\xA4\xAC\xED\x6C\x46\xAF\x70\xAE\x92\x5C\x9B\xBA\x94\x72\xA5\xE7\xA6\xC9\xA8\x43\xA9\x46\xAB\x4F\xA8\xE4\x41\xCC\xD3\x2A\x73\xA4\x7A\xAC\xD5\xA6\xE8\xA4\x4A\xA6\xB3\xAB\x49\x4F\xA8\xB7\xA7\x54\xAA\xD5\xAE\x8C\xA9\xA4\xAB\x3D\xAD\x02\x9C\x31\x5C\xAD\xB9\x90\x71\xB4\xE1\xA3\x7A\xAD\xE9\xAA\xEC\xA7\x75\xA2\x63\x5A\xC8\xA4\xA5\x69\xB7\x9F\x90\x16\xA8\x4D\xAD\x6A\x97\x5D\xAE\x61\x5D\xD7\xB9\xA3\x75\xAF\xE5\xA2\x87\xAE\xFD\x98\xEE\xAB\xB4\xAE\x2C\x55\x90\xB2\xAA\x59\xB2\xC8\xA8\x42\xAE\x0C\x48\x5C\xAF\x7B\xAE\x62\x5D\xA1\xB9\x9A\x40\xA0\xE1\xA6\xD2\xA9\x1D\xAF\xA2\xAD\x75\xAC\x8D\x5A\x84\xB8\x84\x5F\xA2\xD4\xA2\xFE\xA6\xAF\xAD\xEA\x33\xA9\xAE\xB3\x4D\xC5\x9E\x9B\x3E\xA7\x7A\xA8\xD5\xAE\x00\xA8\xAA\xAC\xC8\xAB\x5C\x5D\xCF\x76\x8A\x76\xA3\xDA\xA2\x25\xAE\xA9\xAA\xD6\xA4\x5D\xAE\x8F\x5D\xFF\xB9\x84\x34\xB8\x80\xAE\xC1\xAB\xB0\xAF\x28\xAF\xC2\xAE\x2D\x5A\x87\xBB\x80\x65\xB7\xA1\xAA\x7D\xAC\x58\x8D\x11\xAA\x50\xAD\x97\x56\xA6\xEE\x50\x76\xB3\x78\xA4\xDB\xA6\x7F\xA6\x6D\xA7\xB8\xAB\x9E\x4F\x8F\xAF\xBA\x36\xB1\xBC\xA2\x87\xA3\xA5\xAD\x94\x80\x57\xAD\x68\x52\xA8\x31\x9E\x6A\xB2\xD5\xA2\x84\x80\x71\xA7\xD6\xA9\x1C\x5A\x2E\x5C\xDA\xA1\xBF\x75\xB5\x79\xAE\xD0\xA9\xB0\xAD\x3E\xAE\x65\xAB\x7D\x5A\x92\xA7\x86\x71\xB7\xCE\xA8\xC4\xAC\xD5\xA1\x7D\xA7\x7F\xA8\x8B\x26\xBD\xB8\x97\x82\x86\x25\xAB\xD3\xAB\xA9\xA7\x48\xAE\x07\xAE\x6C\x4F\xA8\xBB\xA2\x70\xB3\xE0\x9E\x6B\xAE\x37\x9E\x35\xA8\x68\xAD\x67\x59\xAA\x2E\x9B\x31\x9E\x5D\xA4\xC2\x30\xD5\xA5\x73\xAE\xB9\xAE\x82\x5D\x83\xBA\x9B\x40\xA5\xE8\xAC\x9A\xAA\xB5\xAE\x6B\xAD\x76\xA3\xAD\x51\xF7\xA6\xAF\x46\xB9\xE2\xAB\x59\xAB\x28\xA4\xEF\x90\xB1\xA4\xEF\x5D\x99\xBA\x98\x73\xAA\xEA\xAA\xCD\xAC\xA9\xAC\x37\xAE\x69\xAD\x20\x95\x02\xB3\x86\x49\x87\xE3\xAE\xAE\xAC\x04\xAD\x9E\x90\xF7\xAE\x71\x5D\x82\xBC\xB3\x75\xB9\xE6\xA0\xCB\xA9\xE3\xA7\x68\xA7\x59\xAE\x4F\x3E\x9C\xA5\x86\x75\xB2\x76\xA1\xE1\xA8\xA9\xAE\x46\xAF\x84\xAC\x1C\x5D\xDB\xB9\xA6\x6C\xB8\x87\xA2\xE6\x9A\x4C\x9D\x81\xA5\x00\xAF\x1E\x5E\x83\xBC\xA0\x78\xAB\xEA\xA0\xD4\xAD\x88\xAF\x0D\xAF\x44\xAE\xA6\xC6\x77\x9C\xA4\xDD\x8A\x95\xA7\xBF\xA4\x37\xA6\x35\xAE\x09\xAF\xF1\x5D\xC9\x9C\x83\x38\xA9\xD4\xAB\xA4\xAE\xBE\xAF\x8B\xAD\x6E\xA8\x84\x56\xB1\xB3\x8F\x5F\xAE\xB9\xA4\x9B\xAE\xB1\xAE\x79\x32\x70\xA7\x77\x4C\xC0\x9F\x8C\x70\xAA\x7B\xA0\xDE\xAC\xF8\xA6\x78\xAF\x52\xAE\xAA\x5B\xA7\xB9\xBD\x66\xA8\x9D\xA3\x2D\x91\xF5\x30\x92\xAF\xDF\xA7\xE2\x4E\xCB\xBC\xA4\x3B\xAD\xF2\xA3\x9F\xAC\xC6\xA4\x93\xA6\xEB\xAD\x9B\x57\xC7\xB3\xAF\x41\xBE\x33\x87\x87\xA9\x8B\x9E\xFE\x67\x91\xAB\xEE\x47\x80\xBC\x9D\x78\xB1\xE9\xA2\xCE\xAE\xA7\xAC\x4D\xAE\x30\xAD\x36\x5D\xD3\x73\x9B\xD5\x99\x9D\xA6\xCC\xAC\x68\xAE\x41\xA3\xDE\xA9\x6D\xDF\x42\xD4\x17\x79\xAA\x7F\xAA\xE4\xAD\x83\xAC\x93\xAE\x51\xAE\xD3\x5B\xF4\xBB\x8D\x6B\xA8\xE9\xA3\x12\xAB\x10\xAF\xC4\x99", "\x67\xA0\x10\x5E\x80\xBB\xB0\x77\xAF\xEE\xA7\x6D\xA9\xBA\xAE\xE6\xA9\x52\x57\xDE\x5C\xCF\x83\x89\x7A\xBF\xE4\xAE\xDC\xA8\xA2\xAF\xD2\xAC\x89\xAE\xBE\x5B\xDC\xA9\xA1\x6D\xAF\xFE\x33\xE9\xAB\xB6\xAF\xA5\xA7\xCE\xA6\x99\x4E\x9F\x9B\x97\x3C\xA1\x6D\xA6\xE1\xAA\x96\xAD\xBC\xA9\xDE\x93\x9E\x5B\x90\x81\x61\x4B\xAF\xE9\xAC\xDD\xAF\xC6\xAD\x8A\xAF\x09\xAF\x04\x5E\x95\xBC\x9D\x3A\xBA\x78\xAC\x55\x89\xC2\xAB\x33\x4B\x4E\xAF\xA2\x5D\xE8\x9E\xA4\x76\xBF\xF3\xA6\xDA\xA9\xD0\xAC\x8F\xAF\x08\xAE\x3E\x5E\xCD\xB4\x81\x65\xB4\xD0\xA2\x4F\xAC\xA1\xAF\x46\xA0\x5C\xAF\x0E\x47\xBA\x8E\xBA\x6E\xB3\xD7\xAA\xB9\xAB\x3D\xAE\x6B\xAB\xCA\x59\x16\x5D\xAF\x17\x88\x7B\xB9\x39\xAF\x8C\x85\x78\xA7\x13\xA6\x36\xA4\xF4\x56\xE5\xAD\xBE\x6C\xB9\xC2\xAF\x4F\xA8\xAC\xAC\xF6\xA4\x57\xAF\x6C\x5E\xC9\xBA\xAB\x78\xA5\xF0\xAD\xE2\xAF\xC0\xAC\xBB\xA4\xA1\xAC\x52\x07\xB2\xAC\x8C\x8C\x9C\xF0\xAA\xE8\xA8\xC7\xAC\xA3\xAE\x72\xAB\x8E\x5E\xA5\xA7\xB6\x27\x9F\x68\xA3\xF7\xA2\x54\xAC\x73\x35\x3D\xAF\x45\x4E\x80\xBA\x87\x39\xA1\x70\xAA\xE3\xAC\xA0\xAF\xAF\xAE\x83\xAE\xC1\x5E\x93\xB8\xA1\x39\xB6\x84\xA3\xF8\xA6\x80\xAA\xB7\xAE\xE6\xAE\x6B\x5E\xBC\xBA\xAD\x79\xBE\xD5\xA3\xB7\xAA\xAB\xAF\xBD\xAB\xCC\xAE\x5E\x33\xED\xB1\x8D\x50\xB8\xB1\x9D\x7C\xA0\xDF\xAD\xEA\xA7\x17\xA7\x24\x4F\xB1\x9C\xA6\x3C\xB3\x71\xA2\xCD\xA5\xC6\xA6\x00\xAA\xFE\xA9\xC3\x5E\xDE\xBA\xB9\x41\x92\x4C\x56\xF1\xAC\xEA\xA4\x86\xA7\xD5\xA7\x25\x4F\xAD\x9F\xA7\x3C\xAF\x7D\xA9\xF2\xA0\xCA\xA8\x63\xAC\x05\xA8\x5B\x51\xAB\xAA\x9D\x6A\xA4\xD4\x8F\x15\xAE\x50\x8E\x5B\xAF\x21\xA9\xFB\x21\xA5\xBE\x92\x3C\xBF\xF4\xA4\xF1\xA1\xD4\xAE\xC5\xA7\x4D\xA7\x18\x4F\xB3\xBD\x97\x78\xA7\xF5\xA1\x8E\xA2\x4B\xA1\xD1\x93\xDD\xAB\x13\x59\xBF\x41\x96\x79\xA9\x6A\xA6\x01\xAB\xB4\xAD\x40\xAF\x0C\xA8\xF2\x5D\x84\xBB\x82\x7A\xB5\xDE\xAF\xF1\xAF\x7A\xAF\xC9\xA9\x99\xA9\x34\x52\xC9\xA4\xAE\x1F\x97\x99\xA8\xCC\xAA\xCF\xAA\x7B\x5F\x9C\xAF\x4C\x5F\xEE\x9A\xA7\x7C\xBE\x75\xAA\xD3\xA0\xEB\xA5\xB0\xA6\xED\xA7\x5B\x4F\xB4\xBD\xA6\x4C\xAC\xED\xA0\xA8\xAA\x39\xAD\xA4\xAC\x8D\x62\x93\x5A\xDA\x99\xAD\x7A\xA8\xF1\xA1\xEE\xAF\xC3\xAF\x33\xAF\x10\xAF\x06\x5E\xD7\xA4\x98\x7D\xA4\xD3\xA5\x45\x9F\x53\xAE\xE1\x96\xE1\xA6\xC6\x4C\xDF\xBD\xB4\x7D\xAA\xF8\xA2\xEE\xAF\xEE\xAC\x8B\xAF\x9A\xAE\xD2\x5C\x9D\xB1\x94\x37\xA7\xEE\x99\x8F\xA1\x56\xAC\x76\xA7\xAC\xA9\x2B\x5C\xC4\x1E\x32\x98\x2F\x8B\x35\x19\x77\xBB\xA5\x99\x66\xF4\xA7\x66\x4F\xF9\xBD\x8E\x7D\xBB\xF7\xA2\xD0\xAD\xDF\xAF\x7C\xAF\x7F\xAF\xF5\x5D\xE0\xBC\x82\x0C\xBF\xC1\xA6\xEC\xA6\x4F\xA8\x56\xAD\xFE\x9E\xC9\xF8\x7B\x43\x98\x7E\xBE\x7D\xAC\xE7\xA9\xCB\xAE\x9F\xAF\x2D\xAF\x80\x5E\x8F\xB8\xA0\x7E\xA3\xF4\xA1\xF0\xAF\xDB\x9B\x67\xAD\xCB\x9D\xA1\x59\xAB\x8D\x9F\xD2\x83\xB6\xA2\x79\xA8\x35\xA8\x13\xAF\xEB\x7E\xAB\x5F\x88\x99\xA1\x3B\xAA\x64\xA0\xA8\xA1\x6E\xAD\x74\xAD\xBE\xAC\x23\x5A\xFF\xB3\xBC\x66\xB3\xCB\xA9\x28\xA8\x6F\xA9\x05\xAD\x05\x3B\x7F\x54\xA6\xEE\x41\x7F\xB7\x64\xAD\xFA\xAC\xF8\xAC\xAF\xAC\x46\xA6\x0C\x5F\xEF\xB2\xA7\x6D\xA6\xCE\xA5\xC0\xA2\x01\x99\xE0\xA8\xD3\xAA\x22\x58\xE0\xAD\xA8\xE9\x33\x3E\xAF\xBA\xA8\x73\xAC\xD7\xAC\x7A\xAD\x7A\x5C\xF6\xB5\x9A\x78\xAD\xEF\xA6\x8D\xA2\xBC\x95\x64\xAF\xAA\xAE\x93\x5D\xD7\xBA\xB8\x76\xA7\xBB\xAA\xDB\xA8\xF4\xA5\x94\xAE\x67\xAB\x7D\x5C\xDA\xBB\xB7\x02\xBD\x7D\xA2\xFC\xA9\xC9\xAE\xEB\xAF\xB4\xA7\xB0\x5F\xBD\xBD\xB2\x7E\xBE\xF2\xA5\x9F\xAA\xF4\xAC\xC9\x8B\x17\xAF\x6B\x4C\xFB\xAD\x9C\x66\x99\x1B\xAD\xB0\xAC\xEF\x99\x6E\x35\xE9\xAF\xB9\x4C\xBB\xBE\xB2\x3B\xA0\xF5\xA4\xEF\xA2\xD4\xAC\xD0\xAE\x52\xAF\x42\x5F\xA6\xBD\xAB\x7D\xA5\xFD\xAB\xA9\xA8\x4F\x5A\xC1\xAA\x60\xA9\xC7\x5C\xF9\xAC\xBF\x53\x8E\x98\x40\x01\xB1\xB6\xA6\x61\xA7\xF7\xAF\xEC\x5C\xD6\xBA\x9E\x35\xAF\xE7\xA2\xC5\xA6\xE1\xAD\xC4\xAA\xDE\xAE\x13\x57\x8F\xA6\x6B\xB9\x74\xF2\xA1\x52\x99\xF5\x31\x09\xB1\x5D\xA7\x12\x60\xD5\x9F\x94\x80\xB7\x7E\xA6\x01\xB6\xDE\xA5\xD0\xAE\x7C\xA7\x6A\x5F\xBD\xAE\x8C\x06\x91\xBC\x39\x86\xA9\x39\xAD\xB2\xA9\x8D\xAD\x19\x3A\xE8\xBC\x95\x0E\xA4\xFF\xAA\xB5\xAE\xFC\xAD\xD9\xAC\xF4\xAF\x1D\x5D\xE9\xAB\x9B\x4A\x90\xBD\x85\xCC\xAC\xB3\xAF\x6C\xAD\x84\xAB\x60\x35\xE2\xDA\x07\x7C\xB7\x01\xB1\xF2\xA6\xE4\xAF\xC8\xA6\x94\xAF\x1A\x5F\xAA\xBE\x9C\x7C\xA8\x79\xAE\xF1\xAD\x86\xA8\xC8\xAF\xE2\x6B\xD4\x5C", "\xFF\xBB\x92\x3F\xBA\x40\xA2\xF6\xAF\x0B\xB0\xD9\xAE\xD6\xA7\x66\x5F\xAE\x9F\xA8\x7D\xB0\x7D\xA1\x04\xB6\xE9\xAA\x89\xA5\xAB\xAD\xC8\x06\xCD\x8F\x9C\x81\xB3\x7A\xA9\x03\xB2\x9E\xA6\xF5\xA7\x36\xA7\xD8\x4F\xD9\x9E\xB3\x81\xAD\xF9\xAB\x98\xAF\x0C\xB2\xEE\xA3\xE7\xA9\xEB\x4C\xFB\xC0\x8A\x04\xB7\xF8\xA6\xE4\xA1\xE3\xAC\x92\xA6\x19\xA7\x4A\x4E\x84\xC0\x8A\x6A\xA6\x00\xB8\xD8\xA8\x46\xAF\x53\xAF\x55\xAF\xD2\x5E\xED\xBF\x97\xBA\x9A\x7B\xA4\x72\xA1\xFE\xAF\x0A\xB1\xCA\xAE\x43\x57\xAE\xC0\x85\x5D\xB6\xDB\xAC\xF1\xA0\xFE\x8B\x43\x5C\x45\xB0\x7E\x42\xD8\xBC\x96\x7F\xA0\xD9\xA6\xFC\xAC\xA4\xAC\xF2\xAF\xDE\xAD\x92\x5B\xCA\xB7\xA9\x7A\xA0\xDC\xA6\xA1\xAB\xBB\xAC\xE2\xA7\xEE\xAE\x9C\x60\x93\x95\x8C\x7B\xAD\xD3\xA4\x73\xAC\x7C\xAD\x55\x98\xF4\xA9\xE0\x26\xFC\xBF\x94\x7F\xBA\xFC\xAA\xEB\xAF\xE9\xAD\x69\xAF\xA8\xAF\xA7\x5D\xD3\xBE\xA7\x74\xB5\xFD\xA9\xD2\xAA\x39\xA3\xDD\xAB\x1A\xAF\xC2\x60\x91\xC0\xA7\x80\xB4\xED\xA2\xD9\xAE\xB6\xAC\xE7\xA7\xF9\xAF\x59\x5D\xF5\xBF\xA1\x55\xB7\xFF\xA4\xA7\xA6\xB7\xAC\x51\xA9\x96\xAE\x46\x51\xAA\x46\xB7\x82\xA0\xF7\xA4\xF8\xAE\xEE\xAF\x4C\xAE\xBC\xAF\xE5\x5E\x9E\xBA\xB8\x20\xAA\x03\xB0\xF2\xA4\x0F\xB3\x34\xB0\x9E\xAF\xB5\x5D\x95\x9E\xB7\x76\xA6\xD5\xA9\xDB\xAF\xB2\xAF\x6E\xAE\x88\xAF\x07\x58\xC3\xBA\x8E\x7C\x94\xBC\xA2\xFD\xA8\xCD\xA7\xF4\xA7\xA1\xA7\x28\x60\xED\x97\xAD\x73\xB8\x59\xAC\x02\xB7\x8C\xA5\x3C\xAE\xB4\xAD\x52\x56\xE8\xBD\xAD\xEB\x9E\xBC\xAB\x51\xA8\xF8\xAE\x3F\xB0\x36\xB0\x6A\x4E\xBD\x9D\x96\x3D\xA5\xFB\xA1\x08\xB7\xEC\xAF\x0F\xB1\xED\xA7\x75\x60\xE7\xBA\xAB\x6A\xAA\x08\xB4\x65\xAA\xE1\x92\x0D\xB1\x87\xB0\x52\x48\xEF\xC1\x93\x80\xBD\xF9\xA5\x01\xB7\xE7\xAE\x0F\xB0\x0C\xB0\x40\x60\xC3\xBE\x9B\x80\xB0\xF9\xA5\x16\xAA\xE6\xAD\xF5\x70\x81\xAC\xBA\x31\xFA\x9F\x55\x2C\xB0\x17\xAB\x06\xB1\x24\xB0\x00\xA9\x75\xAE\x02\x61\xAA\xC0\x84\x40\xA0\x05\xB0\xCF\xAA\x14\xB1\xDD\xAD\x1A\xAC\x45\x5F\xAF\xAF\x87\x7D\xB0\xC6\x9B\x53\xAD\x08\xAC\x7E\xA7\x9A\xB0\xEE\x48\xCD\xBE\x85\x83\xBC\xFC\xA0\xF5\xAE\xF3\xAE\xD4\xAF\xD9\xAF\x54\x5F\xE6\xC0\x96\x7D\xAC\xFB\xAB\xF7\xAA\xAD\xAC\xFB\xAA\x3C\x8C\xF9\x5B\xAD\xFD\x63\x3F\xBC\x6F\x58\x0A\xB1\x83\xA2\x52\xB1\xF5\xA7\xC6\x60\xBC\xBD\x88\x83\xBE\xF5\xA2\x09\xB5\xC7\xAC\x25\xB1\xD5\xAE\x14\x5C\xF4\xAC\x86\x5A\xA8\x6D\xAA\x92\xAD\xA3\xA1\xA3\x9F\x71\xB0\x83\x5F\xDE\xBB\xBD\x74\xB9\xFE\xAF\xD3\xA8\xF1\xAD\x50\xAE\x31\xAD\xAD\x5D\x84\x5F\xAF\x76\xBF\xFB\xA1\xAA\xAC\xD4\x99\x34\xB0\x13\xB0\x37\x61\xD4\xBA\xA9\x80\xBE\x04\xBB\x13\xB0\x1B\xB2\x65\xAF\x58\xAE\xA9\x5A\xC0\xC2\xA8\xD1\x81\x81\xAA\x18\xAB\x04\xA9\x12\xA9\xF5\xAB\x90\x8E\x47\xBB\xAB\x19\x14\xFC\xAD\x02\xAB\xC6\x7A\xF3\x7C\x1C\xA8\x70\x80\x45\x4E\x54\x86\xB7\x84\x7E\xBF\x78\xD3\xA3\x26\x08\x45\x33\x9B\x61\x95\xC3\xB0\x01\x56\x40\x65\x05\x2C\x43\x74\x0B\xAF\x43\x04\xA1\x61\xA2\xC3\xB0\x01\x49\xCF\x46\x0C\x89\x3F\x4D\x64\x27\x04\x7E\x92\x5F\x8C\x06\x29\x86\xAF\xEC\x8B\x92\x34\x33\x4D\xB5\x72\x2D\x4D\x9C\xD2\x07\xE9\x75\x2D\x92\x2C\x90\x0C\xAD\x84\x7E\x66\x1A\x99\xAF\x34\xDD\x29\x4C\x60\x10\x53\x0D\xBA\x1A\xB2\x86\x7D\xDD\x84\xDD\x4D\xBE\x70\x2D\x41\x6B\x9C\x76\x39\x7A\xAF\x58\x39\xB1\xC3\x8E\x4A\x37\xC4\x61\xC5\xC3\x88\xD5\x3B\x84\x0C\xA0\x4C\xC0\x46\x52\xAD\x09\x00\xD1\x61\xD2\xC3\x8D\x7C\x86\xDC\x33\xB4\x8A\x11\x7C\x39\x6D\x05\x8A\x27\x60\x72\x51\xB4\x18\x5F\x42\x69\x1D\xB5\x32\xB3\x4A\x34\xF9\x7D\x98\x61\xE3\xC3\xB5\x04\x05\x0F\xBA\x1D\xB3\x45\x6D\x75\xB1\x0D\x86\x3D\x06\x15\x34\x78\x14\xB2\x18\x06\x51\x31\xAF\x57\x89\x4C\x52\x5F\xA1\x73\x78\x64\x63\x68\x53\x0F\xB0\x81\x05\x44\x4F\x49\x01\xFB\xB0\x74\xE1\x47\xE6\x27\xC1\x6A\xB1\x1E\xC3\x7B\xC6\x7A\xCE\x06\xE4\x88\x7C\x29\x96\xBF\x94\x1D\x68\x10\xB0\xAA\x84\x8F\x77\x04\xA9\x5E\x9B\x13\x4D\x91\xC2\x95\x3D\xBF\x03\xB7\xF5\xA5\x22\xB2\x1C\xB1\x8B\xB0\x69\x5F\xAA\xC2\xA7\x36\x93\xEE\xA7\xDE\xAC\x4E\xA8\x36\xA8\x8D\x8B\xDA\x50\xFC\x5B\x4C\x88\xA3\x02\x84\x4A\xA7\xD4\xA4\xBB\xAE\x4A\xAF\x8B\x5E\x96\xBD\x90\x6E\xBB\xE7\xA9\xB0\xAC\x43\xB0\xD0\xAD\x0C\xA6\xAE\x1B\xFE\x6D\xAE\x52\x94\x94\x43\x22\xB1\x19\x81\x5A\x6A\x3F\xA7\x89\x3C\xFD\xBC\x80\x80\xA2\x7E\xAC\xE5\xAD\xA4\xAE\x32\xB0\xC3\xAE\x67\x61\xF7\xBB\x97\x2B\xB9\xEF\xA4\x97\xAA\x51\xAB\xB7\xAC\x6E\xA3\x03\xBA\x35\xC4\xBB\x18", "\xA7\xDF\x68\xA1\xA6\x8B\xA5\xAE\xA5\xFE\xA6\x6D\x60\xAA\x9F\xAF\x81\xA9\xF9\xA1\x07\xB3\xE5\xAF\x20\xB1\x32\xB0\x2E\x5F\x86\xC1\x83\x7C\xA5\xA4\xA9\xBE\xAB\x0B\xA9\xB3\x93\x21\x95\x3D\x40\xA1\x16\xAC\x15\x96\x2A\xA2\x8C\x05\x99\x99\x99\x66\x25\xB1\x5E\x46\x8E\xC4\x8C\x81\xB9\xDB\xA0\xBB\xAD\x54\xAF\xA8\xAF\x53\xAD\x88\x61\x98\xBB\x8A\x86\xB1\x98\x9F\x1B\xAD\x2B\x67\x99\xB1\x04\x80\x25\x62\xEA\x94\xB3\x7D\xA9\xF8\xA2\x17\xB3\xE1\xAE\xDC\xAC\xED\xAF\x07\x61\xDC\xBF\x83\x47\xA9\x31\x58\x83\xAB\x6C\xA3\xAA\x4C\x12\xB1\xCA\x44\xA9\x86\x93\x7B\xA2\x3E\xAA\xEC\xAD\x78\xAF\xEE\xAD\x88\xAE\xC9\x5F\xDB\x74\x8A\x6C\xA1\xB6\xAC\xB0\xAE\x30\x82\xF3\xA7\x45\xA3\x36\x62\xF9\xC4\xBC\x29\xA7\x11\xBE\xE9\xAB\x24\xB1\x3C\xB0\x9F\xAF\xF3\x60\xEF\xC4\xB5\x83\xB1\x13\xB7\x0F\xB3\x4E\xB1\x68\xAC\xD8\xAC\x8F\x43\x9A\xB9\xBD\x52\xA8\x83\xAF\xE8\xA6\x9B\x34\x9E\xB1\x44\xB1\xB7\x44\x8A\x93\xB9\x30\xB1\x12\xB8\xF1\xA8\x0C\xB3\x23\xB1\x8D\xAF\x91\x60\x9D\xBE\x9F\x79\xB5\xFA\xA1\xE6\xAD\xFB\xAD\x11\xA7\x54\xAE\x83\xB9\x68\xC4\x8E\x19\xA6\xE1\x6B\x26\xB5\x29\xA6\xCE\xAC\xBE\xA7\xF0\x5B\xD2\xB8\xB2\x6F\xB4\xE2\xA6\xB1\xA8\x93\xAF\x2D\xAF\x32\xAF\x80\x47\xAD\xFD\x4A\x81\xA0\xE2\x62\x2C\xB2\x38\x8C\x4F\x76\x1C\xB1\xAD\x3C\xAB\xC1\xB0\x6D\xB8\xFE\xAF\x27\xB5\x2E\xB0\x9C\xAF\xC4\xAF\xBD\x52\xC4\xA9\x84\x73\xAC\xAF\xA6\x05\xB3\x3B\xAD\x83\x97\xEE\xAC\x33\x3F\xE4\x33\x64\x89\xAD\x23\xAA\x27\xB2\xCD\xAD\xBB\xAF\x57\xAF\x39\x5E\x90\xC1\xBB\x78\xA5\x0B\xB0\xEC\xA9\x48\xB3\x8F\xAE\xBB\x4E\x2C\x3A\xD1\x9C\xA3\x89\xBF\x8E\x80\x2B\xB1\x43\xA4\xB8\xA4\x78\xA7\x00\x61\xD4\xC1\xB0\x7F\xB6\x06\xB4\xD9\xAE\x30\xB1\x28\xB0\x6D\xB0\x69\x57\xB0\xC0\xAD\x36\x92\x64\xAE\xC9\x37\x55\xB1\x37\xA2\x5C\xA5\x13\x43\xB3\xC5\x92\x88\xA3\xFB\xA3\x11\xB0\x0E\xB2\x85\xB0\x2B\xB1\x18\x62\xF4\xC0\x9A\x88\xB6\x03\xB1\x10\x93\xD3\xAF\x12\xB0\x4C\xB1\x4B\x62\xB7\xC4\xB0\x85\xBC\x13\xB9\x0B\xB5\x1C\xAF\xF1\xAF\x5F\xAD\xDB\x5F\xDF\xB6\xB3\x73\xB5\x9E\xA8\x09\xB4\x1D\xB0\xD7\x4B\xB8\x76\x52\x4F\x8B\xC1\x9E\x81\xB2\x12\xB5\x31\xB4\x4A\xB3\xC5\xB1\x31\xB0\x2C\x5F\xD8\xC4\x85\x82\xB3\xEF\x46\xEB\xA9\xF0\xAD\xE3\x4A\x98\xB1\x10\x4F\x82\x9A\x84\x83\xA0\x0B\xBC\x14\xB7\x18\xB2\x53\xB1\x64\xB0\x50\x61\xCB\xC1\xB6\x8B\xA2\xF6\xA9\xB6\xAC\xCC\x7D\xBB\xA8\xDE\xA0\x5B\xEB\x55\xC5\x9E\x6E\x72\xBD\x65\x2C\xB3\x70\xAD\x9B\xB1\x65\xAD\x3F\x62\xA9\xBB\x8B\x8D\xA2\xF8\xAE\xD1\xA4\x27\xA9\x00\xA5\xA8\xB1\x0E\x63\x8B\x8A\x8E\x2A\xB2\x15\xB0\x25\xB3\x62\xB2\x1B\xB1\x9A\xB1\x61\x60\xD5\xC4\xB8\x8C\xB7\x12\xBB\x2B\xB2\x2A\xB1\xAF\xB1\xB8\xA7\x26\x5A\x8A\x32\x52\x8D\xB2\x34\xAD\x2F\xB6\x49\xB1\xC4\xB1\xB2\xB1\xD4\x4F\xFE\xC0\xBB\x80\xA0\x04\xBD\x03\xB1\xFB\xA5\xC6\xB0\x42\xB0\x19\x61\xD1\xAC\xA0\x49\xBE\x06\xB1\x60\x9A\xDD\xAE\x64\x55\xB9\xB1\x7F\x05\xF5\xC6\x97\x35\xAF\x12\xB0\x30\xB7\x1A\xA4\x4E\xB0\x93\xA6\x3A\x61\xEE\xB9\xBC\x84\xAD\x01\xB8\x30\xB1\x75\xAE\xC2\xB0\x46\xAE\x0C\x55\x9F\xA4\xA6\xDC\x68\x1C\xB6\x57\x92\x71\xB0\x05\xA9\xFF\xA7\x5F\x61\xBA\xC4\xBB\x7A\xA1\x00\xB3\x16\xB3\x00\xB2\xAE\xB1\x02\xB0\xBC\x62\xF7\xB3\x86\xE1\x8A\xCC\x43\x14\x59\x43\x75\x17\x86\x9D\xA8\x2F\x63\xEB\xC5\xBF\x07\x16\x0D\xB0\x1F\xB4\x73\xB0\x41\x80\xFA\xB0\x3C\x0F\x11\x42\x7A\x96\x94\xE4\x67\x2D\x6D\x82\x1A\x23\x93\xD4\x92\x16\x65\x06\x9F\x7B\x8E\xB8\x82\xAF\x13\x7E\xBE\x1E\x54\x1F\xDF\xB1\xC7\x25\xD2\x10\x8B\x4F\x64\x83\x8E\x9C\x4D\x28\x6F\x30\x75\xEB\x4C\x64\x10\xA4\xC3\x8D\x83\x76\x1D\xB8\x61\xA5\x78\x30\x7A\x4D\xF3\x25\xB0\x63\xBF\xC6\xB2\x8E\xA2\x7B\x3B\x92\x32\x3E\x4C\x19\x88\xD7\xB0\x8F\x51\x53\xC7\xA1\x8D\xA2\xD0\x4C\xF3\x04\x40\x4E\x40\x00\x43\x6E\xCC\xFB\x48\x1E\x2F\x87\xA5\x67\x84\x3D\xB1\x0F\x83\xDB\x6F\x1C\x7E\xCA\xFE\x02\xFC\x46\x67\x5C\x79\x06\x1F\xB0\x3C\x4D\xFB\xB0\xEA\xA2\x0E\x62\xE6\xE0\x76\x22\x1B\x0F\xB1\xC6\x7C\xAA\x93\x4A\x34\x13\x4D\xF6\x63\xE3\xC7\xB0\x34\x19\x0F\xB3\x20\xB1\x46\x4C\x7F\xB0\xF2\x31\x89\x94\x7C\xC1\x80\xE2\x97\x1F\xBD\x5D\xA4\x49\xB3\x83\xB0\x76\x9B\x6D\x4D\xE6\xC6\xB4\x8C\xB4\x10\xB4\x11\xB5\x6F\xB2\x20\xB1\xBF\xB1\x3A\x63\x81\xC7\xAF\x7C\xB8\x0D\xAC\x11\xB5\xD5\x7F\x96\x4C\xF1\xB1\x87\xD9\x63\x34\x51\x7D\x7E\x8F\x8C\x40\xB1\xAC\x22\x6F\xB0\x0A\x02\x0F\x42\xCE\x82\xB6\x66\x53\xF8\xA1\x4B", "\xA1\x49\xB2\x00\xB3\x49\xA2\x78\x4B\xFB\xC4\xAF\x8B\xB5\xFB\xAA\xE2\xAE\xF0\xAC\xB9\xAE\xBB\xB0\x4D\x5D\xD8\xB4\x8A\x74\xAC\x1E\x96\x14\xB0\x89\xA5\xE2\x4D\xED\xB1\x0F\x64\xE4\x6F\xB8\x3D\xA1\x1D\xBF\xFF\xAB\x74\xB0\x8F\xB1\xD8\xAF\xE1\x5D\xD9\xC6\xA3\x77\xBC\x99\xA6\xBE\xAB\x2D\xB3\x5A\xAE\x90\xA9\x67\x5A\xD8\xC0\xBC\xE2\x83\x92\xA4\x2D\xB7\x85\xB1\x93\xB1\xC5\xB1\x77\x63\x8D\xC7\xAE\x7F\xA2\x18\xB3\x18\xB4\x60\xB2\xFC\xAE\x7A\xB0\xF4\x5F\xF6\xC1\xB6\x7F\xB7\x1C\xB4\xBF\xAE\xE8\xAC\xB2\x9E\xA4\xAF\x7D\x5D\xF1\xF9\x65\x90\xAA\xBE\x6E\xFF\xA6\xCA\xA5\x1F\xB1\x35\xA7\x14\x64\x96\xC6\x96\x90\xB6\x08\xB8\x12\xB0\x23\xB3\xC6\xB0\x8D\xB0\xBB\x3F\x9B\xBB\x9D\x64\xA5\xBE\xAD\xD8\xAA\x8D\xB2\x15\xB3\x20\xB2\xF5\x37\xC2\xC6\x8C\x82\xBA\xF7\xAE\x08\xB4\xDF\xAE\xBC\xB0\x7F\xAF\xF4\x62\x80\xBE\x9B\x8D\xA8\xE8\xA2\x33\xAB\x01\xA8\xCD\xA9\x94\xAC\x9E\x5D\xBE\xA1\xBE\x91\xA0\x1A\xB4\xE9\xA5\x9B\xA5\xDE\xB0\x38\xB2\x7B\x63\x95\xC4\xB3\x91\xB7\x10\xB5\x47\xB1\x43\xB2\x06\xB0\x21\xB0\x9A\x5D\xF9\xC2\x94\xD1\x8D\x80\xA6\x50\xA7\x01\xA8\xCF\x97\x35\xB2\x9F\xDB\x1A\xC1\x9C\xC5\x81\x80\xAA\x86\xA7\xDA\xAF\x1F\xA5\x82\xB0\x60\x4D\x95\xC7\x9B\x75\xA6\x15\xB4\x92\x9B\x79\xAE\x73\x62\x13\xAE\xFD\x48\xA8\xB8\x87\x65\xB3\x2F\xA1\xF9\xAF\x33\xB1\xE9\x00\xF6\xB0\xED\x61\xC0\xDB\x6E\xC4\x6E\xF9\x72\x19\xB1\x93\x2C\x30\xB3\x60\xB2\x83\xF6\x35\xE2\x6F\xEF\x65\x26\xB5\x71\x77\x98\xB0\x32\xB3\x0C\x61\x0F\xA7\x60\xA0\x8D\x8E\x3A\x79\x01\x02\x06\x99\xB1\x0E\xA8\x63\x8B\xD0\x0C\xA9\x05\xBA\x3C\x03\x01\x06\x4D\xB7\x99\xB0\xA2\x79\x5D\x86\x84\x6C\x4A\xB2\x90\x02\x8A\x43\x8E\xD9\x8A\x18\x6B\xFF\x7C\x77\x68\x4A\xFA\x08\x16\xAA\x64\x8A\x58\x88\xB3\x86\x21\xAD\x98\xA3\x60\x70\xCC\x64\xC5\x28\x1D\x93\xB5\x43\x8D\x33\xB6\xF4\x8D\x6C\xB0\x19\x74\xF3\x64\xDD\x21\xB5\x86\xAF\x1D\xB5\x84\x87\x9E\xB2\xEC\x35\x7C\xB2\xD2\x61\xAB\xD2\x18\x2F\x92\x2B\x8E\x4B\xB3\xE4\x08\x40\xB2\xD5\xB0\x2B\x69\x27\x19\x89\x0A\x8A\xCA\xA5\x61\x74\x80\x7F\x23\x72\xF0\x4C\x0D\x65\xB2\x8D\x84\x20\xB8\x1A\x5E\x12\x8C\xC6\x60\x4C\x88\xB8\x7A\x47\xFF\x03\x16\x91\x94\xAC\x36\xA3\x51\xB4\xC1\x70\xD3\x7E\xC7\x88\xCC\x69\x1B\xCA\x9F\x1B\xA6\x3C\xAE\x34\x1F\x27\x89\x67\x88\xD9\x7A\x9F\x11\xFF\xE7\x46\xD3\x77\x28\x7F\x61\x73\xA4\xB3\xEF\xA2\xF6\x72\x1A\xFA\x10\x18\x1C\xE8\x60\x8A\x83\xF5\x7F\xB0\x7B\x31\x48\x91\xB2\xF6\x46\xE4\x90\xAA\x96\x72\x8A\x85\xF6\x7D\x9C\x7A\x52\x88\x94\x79\xAE\xE4\x58\xE5\x73\x46\x96\xEB\x54\x61\x72\xBD\x71\x47\xB2\xE6\x72\x99\xF5\x11\xE4\x29\x45\x95\xAF\x64\x71\xAC\x2D\x88\x05\x7A\xB1\x88\xF4\x52\xAA\xE5\x2B\x23\xB3\x07\x20\xA4\x7C\x32\x89\x50\xB3\x79\x79\x20\x65\xAD\xCA\xB9\x94\xAC\x44\xAB\x53\xB6\x88\x5D\x42\x7A\xAB\xB2\xEF\xE4\x21\x7B\x7F\x93\x78\x29\xBA\x70\xA7\xA5\xB0\x6F\x72\x2C\x7D\xBB\xF5\x1A\xFF\x4D\x95\xBC\xFC\x74\x41\x78\xB8\x7B\x94\x7C\xB2\xB2\x1E\x47\xE6\xCA\xA5\x94\xA5\xAE\x73\xA6\x7C\xA6\xB2\x53\xB2\xA6\x88\xCB\xF5\x3F\x03\xB0\x95\xB5\x39\xA7\x54\xB5\xAB\xB1\xF0\x79\x85\x06\x2E\xF5\x4F\xFF\x5D\xD6\x6C\x2B\xBC\x14\x8F\xF4\x7F\x5B\x89\x04\x73\x42\xF5\x25\x91\xBE\x95\xB7\xFB\x7F\xFA\x7C\x33\x89\x7E\x7A\xE4\x7A\x41\x11\xD5\x84\x79\xE9\x68\xAF\x7B\x57\xB2\xE9\xA1\x5F\xB3\x35\x1C\xA6\x11\xE9\xA5\x44\x42\xB5\x2C\xBB\x75\xA7\xB2\xB2\xD2\x18\xF6\x7A\x58\x14\x9A\xCA\x86\x95\xAA\x41\xA0\x15\x26\xC0\x8A\x96\xAD\xAC\xB2\xF8\xE5\x12\xCA\xA4\x96\xAD\x58\x17\x1B\x8F\x83\x7A\xA9\x5D\xE8\x7F\x95\xBC\x7F\x06\x7A\x3C\x11\x01\x07\x50\xB1\x7D\x7F\xB1\x82\x21\x86\x93\xD2\x01\x19\xA6\x26\x0E\x62\x89\x1D\x7C\xC0\x53\x76\x78\x89\x37\x52\x0C\xBC\x54\xA7\x86\xA6\x08\x0E\x62\x2E\x9B\xB0\xA3\x62\xC5\x85\x8E\xF0\x4A\xB2\xB5\x00\x15\x2D\xB5\x11\x72\xB0\x80\x26\x14\x4D\x61\xA9\x5C\x20\xFE\x7D\xEF\x6A\xCA\xA7\x03\x04\xB9\xB1\x5E\x95\xCC\x78\x21\x0C\xDC\x53\x94\x76\x94\x2E\x5D\xC2\x85\x21\x83\xAE\x3B\xA8\x85\x29\xD7\x6F\x16\xB3\x30\x95\x5A\x8F\xC7\x80\x79\x01\x53\x89\xD4\x8E\x94\xE7\x16\xCA\x32\x31\x84\x84\x7C\xC7\x80\x67\x7E\x0E\x3F\x17\x86\x52\x0B\xB2\x18\x81\x67\x31\x91\x74\x06\x00\x31\x33\x73\xB0\x30\x36\xD6\x65\xC6\xCB\xA3\xB3\x46\xDC\x36\x48\x89\x06\xA8\x39\x6C\x46\x8A\x35\x50\xCC\x2D\x9D\x44\x85\x27\xB5\x0E\x6D\x19\x72\x73\xA3\x37\x85\xD5\x45\xBB\x8F\x27\x76\x87\x2D\xB3\x10\x02\xDB\x88\xC3", "\x85\x8D\x85\x58\x1B\x95\x57\x01\x98\xA4\xED\x8A\x4F\xB1\x7F\x85\x36\xB3\xEC\xB1\xB6\x45\xCD\x28\xAD\x2C\x89\xA5\x7C\x43\xB2\xB5\x8E\x77\xB0\xD7\x8E\x81\x1B\xDB\x9F\x13\x98\xAA\xDF\x39\x5F\xB6\xAB\x8F\x4A\x34\x44\x86\x0D\x1F\x94\x19\x9F\x75\x83\x2E\xB5\x81\x3D\xC4\xB0\x00\x91\x67\x86\xA6\x16\xF0\xC3\x8E\x01\x87\xFC\x7C\xB3\x87\xD5\x8B\x10\x71\x76\xB2\x31\x0D\x72\x01\xA5\x92\x23\x31\xB0\xAD\x1E\xC5\xB2\x89\xB2\x4E\x86\x06\x01\x42\x17\x8A\x64\x8C\x31\xB0\x29\x06\xC7\xB1\x45\x70\x30\xB1\x1A\x1D\x2C\xE9\x19\x41\xAB\x52\x90\x0F\x22\xD4\x88\xC9\xAA\x9F\x55\x40\x29\x51\x54\x90\x45\x13\x52\x99\x23\x03\x6C\x55\x5E\x79\x2E\x95\x50\x2A\x90\x17\x59\xA9\x8B\x5A\x5C\xB5\x55\x69\x55\x2A\x2F\x30\x95\x4B\x1B\xBA\x1E\x07\x01\x06\x32\xB0\xB4\x89\xA1\xB0\xAB\x53\xD6\x35\xF1\x64\xC9\x00\x24\x99\xA8\x26\xBB\x92\x37\x7D\x87\xF6\x78\x9D\x07\x1A\x19\xFF\xFD\x60\x30\x94\xD5\x7E\xA0\x49\xCE\xB2\xF7\x6E\xC3\x85\x6F\x0C\xF8\x1B\x0E\x2D\x9D\x2E\xB2\xBA\x82\x2C\xAE\x78\xB3\xE0\x2C\x34\x0C\xE5\xCB\x9D\x04\x07\x2F\xB3\xD2\x2D\x19\x72\x9D\xB2\x7A\x92\x90\x0C\xF9\xCC\xA0\x64\x80\x62\x88\x07\xB0\xB7\xB3\xBD\x81\x5A\x86\x6D\x0C\x89\xCD\x8A\x02\x3A\x2D\xBF\x67\xB0\x21\x30\xBC\x7D\xDF\xB2\x73\x0B\xA7\x02\x35\x2D\x88\xAF\x77\x68\xB2\x96\x3E\x1B\x87\x7E\x7D\x33\xF6\x7F\x16\x86\x48\xBD\x34\xB8\x69\x57\xD3\xB0\x71\x78\x05\x79\xEF\xD2\x06\xCD\xA3\x31\x8A\x34\xBD\xBE\x83\xC6\x7B\x7A\xB3\xDA\x79\xA4\x66\xE9\x4B\x9E\x64\x91\x64\x83\xAC\x7B\xBB\xB0\xE8\x85\x39\x00\x7D\x66\xDF\xA8\x95\x9A\xA6\x0E\x04\x5F\xB6\x90\x84\xD2\x06\x14\xB3\xA3\x66\xAB\xCD\x81\xC9\x73\xDA\x72\x21\x12\xD5\xB0\xD4\x7C\x5C\x86\x93\x0A\x40\xCC\x83\x04\x02\x32\xBE\x1A\x8E\x91\x85\x26\x87\x14\x86\xAF\x0C\xA6\x19\xAF\xED\x62\x13\xBC\xCA\x87\x91\x87\xAC\xB2\x56\xB3\xC9\x66\xB0\x19\xBB\xC9\x70\x0F\xB1\x6B\xB1\x2D\x6A\xA9\xB2\x51\x79\x9D\xFB\x2D\x49\x06\x9B\xAB\x5A\x8B\xB6\x85\x99\x84\xA5\x79\x62\x86\xDC\x66\xC2\xCD\x98\xC8\x72\x2D\xB6\x16\x7A\xBF\xB2\xBF\x7C\x6C\x86\x47\x51\x95\x18\xA4\x9B\xA3\x30\xAD\xBA\x7E\x9A\x84\x39\x86\x6A\xB3\xDF\x0C\x96\x18\xAD\x33\x96\x8A\x71\x04\xAE\x11\x0A\xCE\x06\x1D\x80\xC3\x02\x84\xCC\x82\x2C\x93\x2A\xA4\xB9\x7A\x26\xA2\x33\x33\x39\xB3\x03\x01\x22\x18\xAA\x4F\xBC\x2C\xAA\x0B\xA7\xC3\xA1\xEC\x84\x60\x86\xD6\x66\xB7\x19\x9F\x64\x96\xE1\x36\xB3\x7F\x69\x87\x77\xB2\x40\x86\xF1\x65\xBC\xCB\x94\x2D\x9B\x2E\x55\xC3\x80\x6B\x87\x6E\x4C\x80\xB3\x1B\x41\x86\x18\x9D\x2D\x87\x36\xB3\x71\xB4\xDF\xB1\xCE\x34\x6F\x7D\xAE\xA6\x20\xCE\x8D\x05\xAD\x06\x87\xB7\x7A\xDD\xB2\xF2\x3D\x8C\xB3\x83\x0C\xCF\x18\xAA\x86\x31\x62\x8A\x69\xB0\x3C\x4E\xCA\xB3\xB0\xA0\xE7\x0B\xD2\x17\xAC\x31\x8B\x67\x82\xB9\x80\xD9\xB0\xE7\x7D\x77\xB3\xE6\x52\xE2\xA5\x8C\x9C\xAF\x06\xA2\x72\xB7\xE1\xB2\x3A\x87\xB5\x7D\xEC\x0C\x8B\x18\x8B\x9A\xB9\x72\x42\x6A\xB2\xE8\xB1\xC1\xB2\x23\xA0\x10\x46\xA3\xCE\xB3\x9B\xAC\x5F\x8C\x6F\xB0\xD5\xB3\x3E\x59\x8F\xB3\x81\xF2\x45\xCE\x9E\x33\x9D\x36\xB0\x10\x77\xDB\xB1\xDF\x85\x71\x56\xAF\x66\x8E\xA5\x82\xA9\x37\x39\xB6\xEF\xAA\xEB\xB2\xCE\xB3\x50\x86\x91\x66\xD7\xCD\x93\x9A\xBF\x5C\x8A\x22\x7F\xBD\xB2\xA0\xB3\x39\x00\x94\x66\xF2\xCB\x88\x84\x3D\x35\xB9\xBA\x80\xCD\x51\xD1\x7C\x9B\xB3\x59\x67\x8E\xCE\x9B\x9D\xAE\x39\xB6\xC6\x3A\x48\x79\xB1\xB2\xAC\xB3\xF2\x0B\xE2\x18\xA4\x9C\xB4\x35\xB8\x67\x54\xE8\x04\xA3\x52\xC0\xB3\x06\x67\xBD\x17\x81\x33\x85\x37\xBF\x67\xA6\x6D\x7E\x9C\x0A\xBC\xB3\x81\x67\xF9\x15\x5C\x9D\xA2\x8E\x7E\x75\xB5\x96\x3F\xBD\xB3\xFE\xA8\x8C\x45\xE1\x80\xBA\x9D\xA7\x3B\xB6\x27\x7A\xDF\xB2\xD2\xB2\x49\x86\x9B\x10\x03\xCA\xA5\x33\x84\x3B\xBF\x1C\xA6\xEC\xB0\xF7\x84\xB4\xB3\x3C\x67\x95\xCF\x8D\x33\x9A\x65\x82\x6E\xB0\xF1\xB0\xD4\xB2\x63\x2F\x7B\x67\x83\xCF\x98\x9B\xBF\x39\xB3\xCE\x56\xCD\xB2\xD3\xB2\x40\x79\x91\x67\x90\xCD\xA9\x9E\xB2\x34\xBB\x6E\xB1\x33\xB3\x49\x01\x28\x00\x6B\x66\xE5\xCC\x96\x94\x2E\x36\x57\x9E\x96\x66\x7E\xB6\x53\x5D\x31\x12\x0D\xDD\x62\x7B\x9B\x53\x14\xA5\x5A\x74\xA9\x06\x40\x87\x84\x00\xD1\x7C\x6D\x49\x5E\x51\x89\x9B\x6D\xCD\x3E\x86\x15\xF2\xB2\xAD\x56\xCB\x67\x9E\x8C\xAE\x98\x5C\x67\x85\xFA\x97\x66\x86\x52\x58\x7A\xB2\x30\x66\x9F\x3B\x99\x8F\xA2\x85\x7C\xCD\x84\x9E\x87\xC1\xB2\xEC\xB2\x74\x66\xC7\x25\xBB\xA7\x24\x3F\xB3\xCF\x84\x17\x82\xE2\xB3\x88\xB3\xD0", "\x66\xCD\x16\x95\x9C\xBC\x33\xB0\x5F\xB1\xBC\xB2\xDC\xB3\x63\x02\xE4\x65\xD0\x16\xA0\x07\x04\x34\xB3\x2D\x30\x3C\x4C\xFB\xB2\x83\x86\xDD\x0C\x9C\xCF\x95\x9B\xAF\x36\xBE\xCA\x87\xEB\xB2\x48\x32\x94\xB3\x93\xAB\x7F\xCF\xB7\x61\x81\x40\xB7\x7A\xB6\xD9\xB2\x2D\x87\xF8\xB3\x9E\x0B\xF6\xCF\x9A\x9C\xB0\x5B\x8E\x5B\xB2\x6E\x86\x81\x53\xE0\xB2\xE5\x0C\x8A\xD0\x9C\x70\x74\x66\x84\xCB\x82\x99\x87\xCF\x06\xFB\x85\xF5\x66\xED\xE3\x70\x9B\xB8\x8F\xAA\x57\xA7\x9F\x64\x18\x86\x0A\x79\x47\x67\xFB\x16\x89\x9D\xB9\x8A\x6A\xC5\x87\x6F\x41\xD3\xB2\x12\xB4\x52\xA6\x47\x19\xA8\x33\x89\x66\x83\xBD\x80\xE9\xB1\xCF\xB3\x92\xB3\x9C\xFB\x56\xCE\xAB\x88\x1E\x3F\xB4\xD0\x3C\x01\xB7\x15\x86\xD9\xB3\xA0\x66\xA9\x4C\x61\x9D\xB4\x2F\x76\x5E\x32\x03\xB7\xFD\xAD\x83\x86\x1D\x68\xB5\xD0\xAA\xA0\xB7\x41\xB4\x78\xB0\x0D\x01\x7B\xB3\xD2\x21\x7E\x0C\xFA\xCF\x88\x0F\x11\x3B\xB3\x81\xB3\xE1\x20\xDD\xB3\xB7\xB3\x27\x66\xF7\xCE\xBB\x66\x46\x42\xBE\xD9\x9C\x03\xB5\x3D\x86\xDD\xB3\x36\x68\xAA\xCF\xBF\x19\xBE\x3B\xB6\x10\x00\x77\x86\x66\x6D\x61\x53\xED\x67\xF4\xCD\x92\x9E\xBC\x3B\xB6\xBD\x86\xF0\xB2\xD8\x7D\x2D\xB4\x3D\x68\xE6\xCF\xAF\x9F\xA4\x40\xB2\xCC\x86\x4B\x7A\xE3\xB3\xC1\x82\x3C\x68\xB3\x19\x9F\xA1\xBE\x40\xBB\xF3\x00\x04\xB5\xEF\x7C\xBE\x7D\x24\x11\xF9\xD0\xAA\x32\x94\x41\xBC\xA3\x50\x9C\x87\xBE\xB3\xC2\xB3\xA1\x67\xB1\x19\x99\xA0\xB1\x43\xBE\x7E\xB5\xE5\xB0\x10\xB4\x28\x79\xC3\x67\x83\x1A\xB5\xCE\x7C\x42\xB1\x58\xA1\x9B\x3E\xF1\xB3\x7C\x86\xDB\xA6\x57\xCF\xAF\x76\x79\x3E\xB8\x4C\x90\x1A\xA2\xF3\xB3\x72\x53\x92\x68\xB3\xF1\x54\xA2\xB9\x9A\xAB\xB9\x1B\xFA\xB3\x50\x87\xEA\xB3\xDF\x7C\x0D\x1A\x81\x81\x78\x3E\xBE\xCF\x87\xC1\xA3\xB8\x52\x64\x3E\xAC\x67\x86\x02\x3E\xEE\x67\x43\xBF\x7D\xB3\x01\xB6\x1C\xB4\x47\xB4\x53\x67\x93\x17\x84\x33\x83\x87\x82\x88\xB5\x97\x86\x0F\xB4\xC1\xB3\xB9\x68\xBE\xCE\xA2\x7F\x71\x27\xB5\x05\x01\xF8\xB3\x21\x7C\x9E\x07\x01\x0B\x00\x1F\x2D\xA8\x9F\x79\x03\xBC\x32\x13\x0B\x3F\x33\x72\x31\x37\x5D\x77\xC9\x30\xD4\x75\x16\x37\x31\x2B\xBA\xB0\xEF\x5A\x65\xB4\x40\xD3\x1B\x3E\x72\x93\x32\x46\xBA\xA4\x91\x67\x07\x4A\x2F\xC8\x01\xDC\x62\x3C\xB1\x26\xD1\x74\x46\xB2\x8E\xB0\x28\x5A\xED\x4C\xE2\xB0\x0B\x1B\xD8\x00\x14\xA6\x20\x82\x00\x06\x00\xAE\x8E\xF0\x36\xB1\x38\xDB\x68\x97\xA6\x2D\x92\x89\xEB\x2E\x2F\x35\x22\x81\x58\x2E\x56\x33\xEA\x68\x9C\xEA\x39\xA3\xA1\x0B\x7B\x8F\xB0\x3E\x6A\x32\x0A\x98\x2E\xF3\x68\xD5\xBA\x36\xA3\xBA\xEE\x2E\x6E\xB2\x1F\xB0\x10\x08\x31\x08\x8D\x4B\x87\x5A\xBF\x93\x24\xA2\x85\x00\x87\x1E\xB5\xF7\x7E\x25\xA3\xEB\x68\xA8\xDF\x19\x17\xBE\xF7\x5B\x90\xB3\x8B\x89\x43\xB4\xED\x2E\x2F\x09\x5B\x00\x09\x00\x81\xEB\x26\xB8\x88\xC2\x24\xE2\x8D\x3C\x80\xAF\x5D\x7F\x06\x49\xA3\xA2\x8B\x3E\x20\xAB\x53\x2B\x46\xB4\x82\xB4\x1A\x65\x4D\xD1\x89\x2D\x1A\x16\x34\x2E\x35\x75\x01\x34\xB5\x6A\xB4\xD3\x68\xB0\xBA\x16\xA3\xB4\x7F\x58\x8D\xB1\x4C\x61\x3F\xB5\xCE\xA2\x61\x5D\x2D\x41\x71\xA3\xA5\x47\xBD\x8D\xB7\x9F\x31\x38\xB4\x6C\x18\xE3\x68\xB2\xD2\x80\xA6\x8B\x27\x59\x4B\x19\x3A\xB2\x19\x85\x94\x0F\xC6\x68\x89\x16\x9B\x42\x03\x49\xBE\x6A\x52\x23\xB7\x37\x69\xD7\x2E\xDA\x0C\xA7\xD2\x9F\x77\x3B\x28\x3A\x92\xB6\x69\x05\x5B\x2F\xD5\x01\x2E\x69\xE7\xC5\x1C\xA3\xA6\x98\x74\x8E\xB0\x28\xB5\x7D\x94\x9A\xB4\x62\x71\x71\xA0\x4E\xA5\xA9\x01\x70\x95\xB7\x1D\xB7\x53\xB4\xED\x2E\x3A\x69\x91\xBA\x36\x8B\x3E\x4A\xBD\x93\xB3\x5C\x33\x4F\xB4\xA5\x8D\x3B\x69\xEC\xD2\xB0\x01\x40\x82\x0D\x05\x02\x2C\x3B\x0E\x3A\x83\x32\xDF\x68\xBF\xBB\x03\xA4\xBF\xED\x2A\x74\x76\xC7\x70\x47\x3A\xBF\xB4\x1E\x29\xB7\x88\xAB\xA4\xB7\x4A\xB3\xE5\x28\xA1\x33\x45\xB5\xDF\x2E\x75\xD1\x52\xD2\xAE\x77\x3D\x48\xB4\xED\x22\x6A\x04\x8B\x2F\x22\x73\xB3\xFB\x27\xF5\x45\xA4\xAF\x84\xA0\xAA\x7E\xCC\xA0\x78\x4E\x52\x7D\x47\x6C\x54\xCC\x58\xA6\xA4\xF8\xA1\xB1\x87\xD8\x88\xE6\xB3\x1D\x73\x38\x57\xCC\xE2\x74\xEE\x6E\xD9\x7D\x70\xB4\xE5\xB3\xD0\x84\xF4\xB3\x09\x67\x9C\xE4\x40\xA6\xA0\xAC\xA1\xB9\x7B\x34\xB5\xE6\xB3\xD2\xB4\x51\x67\x8F\xCE\x93\x9E\xBE\x43\xBA\x67\xB3\xFE\xB3\x54\x89\xD6\x78\xF5\x67\xC1\xC4\x7B\x9A\xA0\x24\x09\x7F\xB7\xE2\xB2\x79\xB2\x1B\x86\x93\xAB\x2B\xD3\x80\x60\x91\x4C\xB4\xBA\x7C\x34\xB4\xD1\xB3\xCD\xB3\x0D\x68\x83\xD0\x8F\xA0\xA5\x40\xB3\xCC\x87\xE4\xB1\x10\x86\x89\xA9\xB9\x6F\x62\xE2\x11", "\xEC\x6F\x3A\xBA\x79\xB6\x34\xB6\x6C\xB4\x36\xB4\x18\xA6\x54\xD0\xB1\x9C\xBD\x2D\xB0\xC5\x80\xD3\xB3\x05\xB5\x9A\xB3\xAE\xA6\x42\xD3\x8A\x60\x92\xDB\x73\xB0\x7A\x08\x83\xCA\xB3\xD8\xB4\xB1\x67\xC1\xD1\xB8\xA0\xB9\x30\x57\xB7\xA9\x4C\x62\x78\xB5\x50\xAC\xAD\x69\xE5\xD3\x86\xA7\xA5\x08\xA8\x9C\xB7\xD6\x52\x21\xB5\xCF\xB3\x26\x67\xAE\xD0\xBC\x93\xB5\x9D\x7F\x9E\xB2\x42\x8F\xE8\x7D\x96\x7D\xAF\x69\xC7\xD3\x96\xA7\xA9\x4F\xBE\xBB\x82\x18\xB6\x19\x87\x54\xB3\xE1\x69\xD2\xD3\x82\xEE\x73\x4F\xB1\x72\xB5\x3E\xB4\x30\xB5\x02\xB5\xEB\x69\xF7\xA7\x43\xA1\xBB\xA7\xA9\xB3\x22\x41\xB7\x7F\xB4\xBF\x88\xF8\x0B\x79\xCE\x83\xA8\xA2\x40\xB0\x71\xB4\x0E\xB4\xE3\xB2\x68\x78\x4F\x68\x90\x9C\x11\xA1\xBE\x4D\xBB\xB3\x78\xE6\xB3\x2B\x1C\x42\x86\x7A\x41\x3E\xCD\x8D\x8E\x20\x36\xB3\x8B\x7D\x3F\xB7\xE2\xAA\xCD\xB4\xF2\x69\x81\xD4\xB4\xA7\xBB\x50\xB9\x9C\xB5\x43\xB7\x72\xB5\x3A\xB4\x63\x68\xC4\xCD\xA5\xA1\xAE\xD0\x4E\xA2\xB7\x91\x8A\x68\xB5\x18\xB5\x43\x67\xB3\xD4\xA8\xA7\xBC\x50\xB3\x9B\xB6\xCF\xA3\xDE\x7C\x65\xB3\xCB\x0B\x3C\xD4\x96\xA8\xA4\x4E\xB0\xA0\xB1\x48\xB5\x83\xB4\x1A\xB5\x3F\x68\xEA\xD3\x8D\xA1\xBF\x92\x7F\x78\xB1\x41\xB5\x68\xB4\x52\x81\x92\xFB\x58\xF6\x5A\xA8\xA3\x52\xB5\xA3\xB5\x48\xB4\x9E\xB2\x55\x53\x97\x67\xAD\xD4\x8B\xA9\xA4\x4F\xB5\x9C\xB2\x46\xB7\x93\xB4\x2E\xB5\xF6\x69\x9E\xCF\xAC\xA0\xA5\x65\x89\x88\xB3\xDB\xB1\x70\xB5\x31\xB5\xF1\x69\xE5\xD4\x8E\xA9\xA7\x4F\xB0\x7B\xB4\x48\xB4\x76\xB5\x81\x70\x3B\x75\x12\xD2\xB0\x87\xBD\x51\xB8\x44\xAC\x4C\xB5\xDC\x01\x58\xB4\x0B\x32\x4A\xD4\x97\xA9\xB0\x51\xB2\xA7\xB4\x3A\xB4\x6C\xB5\x3A\xB5\x5D\x6A\xF7\xD4\xA6\xC4\x73\xB1\x76\x7B\xB3\x4A\x7C\x9F\xB4\x09\xAB\x7E\x6A\x98\xD4\xA4\x9E\xB1\xEA\xA6\x7A\xB1\x4A\xB4\x84\xB5\x26\xB4\x19\xC2\x3A\x1E\x2D\xA3\xAE\x8B\x73\x0D\x72\x63\x28\x49\xB5\xD4\x33\x9B\x6A\xE4\xD2\xA8\xA4\xB9\x28\x35\x95\xB6\x1B\xB4\x4B\xB4\x68\xB4\x5A\x69\xB0\xD2\x83\xE9\x7D\x4A\xBA\xB4\x8D\x06\x76\x68\x53\x9A\xB4\xB5\xF3\x21\xD5\x97\xCA\x79\x49\xBA\x8D\xB2\x2D\xB7\xBE\x30\x9E\xB4\x39\x4E\xAC\x08\x7E\xA4\xA3\x5B\x0A\xAA\xB4\x2B\xB6\x50\xB4\xDF\xB3\x1A\x1D\x49\xD2\xA0\x6B\x99\x53\xB5\x94\xB0\x13\x78\x91\xB3\xEA\x05\xC2\x6A\xC2\xCF\xBC\x3C\x02\x57\x2B\x00\x80\x3F\xB3\x92\xB1\x4C\x2F\x3D\x01\x0E\xCA\x3A\x2C\x09\xF5\x2B\x92\x30\xCC\xB3\x32\x04\xBB\xB4\x43\xBD\x44\x16\x3C\x7A\x25\x2C\x38\xE0\x29\xD5\x2D\xE5\xAE\xDE\x5B\x66\x00\x58\xD5\xB3\x42\xBF\xC7\xA0\xAF\x36\x5B\xB4\x67\xB5\x16\x03\xD1\x69\x93\xD3\xAA\xAB\xAB\x57\xBC\xAE\xB5\x5D\xB6\xBB\xB5\x77\xB5\xF0\x6A\xF1\xD5\xB2\xAB\xB3\x57\xB4\xAF\xB5\x5E\xB6\xBD\xB5\x7B\xB5\xF8\x6A\xF9\xD5\xBA\xAB\xBB\x57\xBC\xAF\xB5\x5F\xB6\x37\xB2", }; 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 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>& value, const vl::collections::List& tokens); extern void UnescapeFormatString(vl::parsing::ParsingToken& value, const vl::collections::List& tokens); extern void UnescapeString(vl::parsing::ParsingToken& value, const vl::collections::List& tokens); /*********************************************************************** Parsing Tree Conversion Driver Implementation ***********************************************************************/ class WfTreeConverter : public vl::parsing::ParsingTreeConverter { public: using vl::parsing::ParsingTreeConverter::SetMember; bool SetMember(WfClassMemberKind& member, vl::Ptr node, const TokenList& tokens) { vl::Ptr token=node.Cast(); 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 node, const TokenList& tokens) { vl::Ptr token=node.Cast(); 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 node, const TokenList& tokens) { vl::Ptr token=node.Cast(); 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 node, const TokenList& tokens) { vl::Ptr token=node.Cast(); 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 node, const TokenList& tokens) { vl::Ptr token=node.Cast(); 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 node, const TokenList& tokens) { vl::Ptr token=node.Cast(); 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 node, const TokenList& tokens) { vl::Ptr token=node.Cast(); 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 node, const TokenList& tokens) { vl::Ptr token=node.Cast(); 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 node, const TokenList& tokens) { vl::Ptr token=node.Cast(); 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 node, const TokenList& tokens) { vl::Ptr token=node.Cast(); 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 node, const TokenList& tokens) { vl::Ptr token=node.Cast(); 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(WfStateSwitchType& member, vl::Ptr node, const TokenList& tokens) { vl::Ptr token=node.Cast(); if(token) { if(token->GetValue()==L"Default") { member=WfStateSwitchType::Default; return true; } else if(token->GetValue()==L"Pass") { member=WfStateSwitchType::Pass; return true; } else if(token->GetValue()==L"PassAndReturn") { member=WfStateSwitchType::PassAndReturn; return true; } else if(token->GetValue()==L"Ignore") { member=WfStateSwitchType::Ignore; return true; } else if(token->GetValue()==L"IgnoreAndReturn") { member=WfStateSwitchType::IgnoreAndReturn; return true; } else { member=WfStateSwitchType::Default; return false; } } member=WfStateSwitchType::Default; return false; } bool SetMember(WfStateInvokeType& member, vl::Ptr node, const TokenList& tokens) { vl::Ptr token=node.Cast(); if(token) { if(token->GetValue()==L"Goto") { member=WfStateInvokeType::Goto; return true; } else if(token->GetValue()==L"Push") { member=WfStateInvokeType::Push; return true; } else { member=WfStateInvokeType::Goto; return false; } } member=WfStateInvokeType::Goto; return false; } bool SetMember(WfLiteralValue& member, vl::Ptr node, const TokenList& tokens) { vl::Ptr token=node.Cast(); 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 node, const TokenList& tokens) { vl::Ptr token=node.Cast(); 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 node, const TokenList& tokens) { vl::Ptr token=node.Cast(); 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"FlagAnd") { member=WfBinaryOperator::FlagAnd; return true; } else if(token->GetValue()==L"FlagOr") { member=WfBinaryOperator::FlagOr; 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 node, const TokenList& tokens) { vl::Ptr token=node.Cast(); 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 node, const TokenList& tokens) { vl::Ptr token=node.Cast(); 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 node, const TokenList& tokens) { vl::Ptr token=node.Cast(); 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 node, const TokenList& tokens) { vl::Ptr token=node.Cast(); 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 node, const TokenList& tokens) { vl::Ptr token=node.Cast(); 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 node, const TokenList& tokens) { vl::Ptr token=node.Cast(); 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 tree, vl::Ptr obj, const TokenList& tokens) { SetMember(tree->kind, obj->GetMember(L"kind"), tokens); } void Fill(vl::Ptr tree, vl::Ptr obj, const TokenList& tokens) { } void Fill(vl::Ptr tree, vl::Ptr obj, const TokenList& tokens) { } void Fill(vl::Ptr tree, vl::Ptr obj, const TokenList& tokens) { } void Fill(vl::Ptr tree, vl::Ptr 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 tree, vl::Ptr 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 tree, vl::Ptr obj, const TokenList& tokens) { SetMember(tree->name, obj->GetMember(L"name"), tokens); } void Fill(vl::Ptr tree, vl::Ptr obj, const TokenList& tokens) { SetMember(tree->name, obj->GetMember(L"name"), tokens); } void Fill(vl::Ptr tree, vl::Ptr obj, const TokenList& tokens) { SetMember(tree->name, obj->GetMember(L"name"), tokens); } void Fill(vl::Ptr tree, vl::Ptr obj, const TokenList& tokens) { SetMember(tree->element, obj->GetMember(L"element"), tokens); } void Fill(vl::Ptr tree, vl::Ptr obj, const TokenList& tokens) { SetMember(tree->element, obj->GetMember(L"element"), tokens); } void Fill(vl::Ptr tree, vl::Ptr obj, const TokenList& tokens) { SetMember(tree->element, obj->GetMember(L"element"), tokens); } void Fill(vl::Ptr tree, vl::Ptr obj, const TokenList& tokens) { SetMember(tree->element, obj->GetMember(L"element"), tokens); } void Fill(vl::Ptr tree, vl::Ptr 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 tree, vl::Ptr obj, const TokenList& tokens) { SetMember(tree->element, obj->GetMember(L"element"), tokens); } void Fill(vl::Ptr tree, vl::Ptr obj, const TokenList& tokens) { SetMember(tree->result, obj->GetMember(L"result"), tokens); SetMember(tree->arguments, obj->GetMember(L"arguments"), tokens); } void Fill(vl::Ptr tree, vl::Ptr obj, const TokenList& tokens) { SetMember(tree->parent, obj->GetMember(L"parent"), tokens); SetMember(tree->name, obj->GetMember(L"name"), tokens); } void Fill(vl::Ptr tree, vl::Ptr obj, const TokenList& tokens) { SetMember(tree->declarations, obj->GetMember(L"declarations"), tokens); } void Fill(vl::Ptr tree, vl::Ptr 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 tree, vl::Ptr 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 tree, vl::Ptr obj, const TokenList& tokens) { SetMember(tree->type, obj->GetMember(L"type"), tokens); SetMember(tree->expression, obj->GetMember(L"expression"), tokens); } void Fill(vl::Ptr tree, vl::Ptr obj, const TokenList& tokens) { SetMember(tree->arguments, obj->GetMember(L"arguments"), tokens); } void Fill(vl::Ptr tree, vl::Ptr 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 tree, vl::Ptr obj, const TokenList& tokens) { SetMember(tree->type, obj->GetMember(L"type"), tokens); SetMember(tree->arguments, obj->GetMember(L"arguments"), tokens); } void Fill(vl::Ptr tree, vl::Ptr 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 tree, vl::Ptr obj, const TokenList& tokens) { SetMember(tree->statement, obj->GetMember(L"statement"), tokens); } void Fill(vl::Ptr tree, vl::Ptr 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 tree, vl::Ptr obj, const TokenList& tokens) { SetMember(tree->name, obj->GetMember(L"name"), tokens); } void Fill(vl::Ptr tree, vl::Ptr 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 tree, vl::Ptr obj, const TokenList& tokens) { SetMember(tree->kind, obj->GetMember(L"kind"), tokens); SetMember(tree->items, obj->GetMember(L"items"), tokens); } void Fill(vl::Ptr tree, vl::Ptr 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 tree, vl::Ptr obj, const TokenList& tokens) { SetMember(tree->members, obj->GetMember(L"members"), tokens); } void Fill(vl::Ptr tree, vl::Ptr obj, const TokenList& tokens) { SetMember(tree->expandedDeclarations, obj->GetMember(L"expandedDeclarations"), tokens); } void Fill(vl::Ptr tree, vl::Ptr 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 tree, vl::Ptr obj, const TokenList& tokens) { SetMember(tree->baseType, obj->GetMember(L"baseType"), tokens); SetMember(tree->elementType, obj->GetMember(L"elementType"), tokens); } void Fill(vl::Ptr tree, vl::Ptr obj, const TokenList& tokens) { SetMember(tree->expandedDeclarations, obj->GetMember(L"expandedDeclarations"), tokens); } void Fill(vl::Ptr tree, vl::Ptr obj, const TokenList& tokens) { SetMember(tree->name, obj->GetMember(L"name"), tokens); SetMember(tree->arguments, obj->GetMember(L"arguments"), tokens); } void Fill(vl::Ptr tree, vl::Ptr obj, const TokenList& tokens) { SetMember(tree->name, obj->GetMember(L"name"), tokens); SetMember(tree->arguments, obj->GetMember(L"arguments"), tokens); SetMember(tree->statement, obj->GetMember(L"statement"), tokens); } void Fill(vl::Ptr tree, vl::Ptr obj, const TokenList& tokens) { SetMember(tree->inputs, obj->GetMember(L"inputs"), tokens); SetMember(tree->states, obj->GetMember(L"states"), tokens); } void Fill(vl::Ptr tree, vl::Ptr obj, const TokenList& tokens) { } void Fill(vl::Ptr tree, vl::Ptr obj, const TokenList& tokens) { } void Fill(vl::Ptr tree, vl::Ptr obj, const TokenList& tokens) { SetMember(tree->expression, obj->GetMember(L"expression"), tokens); } void Fill(vl::Ptr tree, vl::Ptr obj, const TokenList& tokens) { SetMember(tree->expression, obj->GetMember(L"expression"), tokens); } void Fill(vl::Ptr tree, vl::Ptr obj, const TokenList& tokens) { SetMember(tree->expression, obj->GetMember(L"expression"), tokens); } void Fill(vl::Ptr tree, vl::Ptr 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 tree, vl::Ptr obj, const TokenList& tokens) { SetMember(tree->condition, obj->GetMember(L"condition"), tokens); SetMember(tree->statement, obj->GetMember(L"statement"), tokens); } void Fill(vl::Ptr tree, vl::Ptr 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 tree, vl::Ptr obj, const TokenList& tokens) { SetMember(tree->statements, obj->GetMember(L"statements"), tokens); SetMember(tree->endLabel, obj->GetMember(L"endLabel"), tokens); } void Fill(vl::Ptr tree, vl::Ptr obj, const TokenList& tokens) { SetMember(tree->label, obj->GetMember(L"label"), tokens); } void Fill(vl::Ptr tree, vl::Ptr obj, const TokenList& tokens) { SetMember(tree->variable, obj->GetMember(L"variable"), tokens); } void Fill(vl::Ptr tree, vl::Ptr obj, const TokenList& tokens) { SetMember(tree->expression, obj->GetMember(L"expression"), tokens); } void Fill(vl::Ptr tree, vl::Ptr obj, const TokenList& tokens) { SetMember(tree->expandedStatement, obj->GetMember(L"expandedStatement"), tokens); } void Fill(vl::Ptr tree, vl::Ptr 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 tree, vl::Ptr obj, const TokenList& tokens) { SetMember(tree->expression, obj->GetMember(L"expression"), tokens); SetMember(tree->statement, obj->GetMember(L"statement"), tokens); } void Fill(vl::Ptr tree, vl::Ptr 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 tree, vl::Ptr obj, const TokenList& tokens) { SetMember(tree->name, obj->GetMember(L"name"), tokens); SetMember(tree->statement, obj->GetMember(L"statement"), tokens); } void Fill(vl::Ptr tree, vl::Ptr obj, const TokenList& tokens) { } void Fill(vl::Ptr tree, vl::Ptr obj, const TokenList& tokens) { SetMember(tree->statement, obj->GetMember(L"statement"), tokens); } void Fill(vl::Ptr tree, vl::Ptr 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 tree, vl::Ptr obj, const TokenList& tokens) { } void Fill(vl::Ptr tree, vl::Ptr obj, const TokenList& tokens) { SetMember(tree->name, obj->GetMember(L"name"), tokens); } void Fill(vl::Ptr tree, vl::Ptr obj, const TokenList& tokens) { SetMember(tree->name, obj->GetMember(L"name"), tokens); SetMember(tree->arguments, obj->GetMember(L"arguments"), tokens); SetMember(tree->statement, obj->GetMember(L"statement"), tokens); } void Fill(vl::Ptr tree, vl::Ptr obj, const TokenList& tokens) { SetMember(tree->type, obj->GetMember(L"type"), tokens); SetMember(tree->caseBranches, obj->GetMember(L"caseBranches"), tokens); } void Fill(vl::Ptr tree, vl::Ptr obj, const TokenList& tokens) { SetMember(tree->type, obj->GetMember(L"type"), tokens); SetMember(tree->name, obj->GetMember(L"name"), tokens); SetMember(tree->arguments, obj->GetMember(L"arguments"), tokens); } void Fill(vl::Ptr tree, vl::Ptr obj, const TokenList& tokens) { } void Fill(vl::Ptr tree, vl::Ptr obj, const TokenList& tokens) { SetMember(tree->name, obj->GetMember(L"name"), tokens); } void Fill(vl::Ptr tree, vl::Ptr obj, const TokenList& tokens) { SetMember(tree->name, obj->GetMember(L"name"), tokens); } void Fill(vl::Ptr tree, vl::Ptr obj, const TokenList& tokens) { SetMember(tree->name, obj->GetMember(L"name"), tokens); } void Fill(vl::Ptr tree, vl::Ptr obj, const TokenList& tokens) { SetMember(tree->body, obj->GetMember(L"body"), tokens); } void Fill(vl::Ptr tree, vl::Ptr obj, const TokenList& tokens) { SetMember(tree->parent, obj->GetMember(L"parent"), tokens); SetMember(tree->name, obj->GetMember(L"name"), tokens); } void Fill(vl::Ptr tree, vl::Ptr obj, const TokenList& tokens) { SetMember(tree->parent, obj->GetMember(L"parent"), tokens); SetMember(tree->name, obj->GetMember(L"name"), tokens); } void Fill(vl::Ptr tree, vl::Ptr obj, const TokenList& tokens) { SetMember(tree->value, obj->GetMember(L"value"), tokens); } void Fill(vl::Ptr tree, vl::Ptr obj, const TokenList& tokens) { SetMember(tree->value, obj->GetMember(L"value"), tokens); } void Fill(vl::Ptr tree, vl::Ptr obj, const TokenList& tokens) { SetMember(tree->value, obj->GetMember(L"value"), tokens); } void Fill(vl::Ptr tree, vl::Ptr obj, const TokenList& tokens) { if(SetMember(tree->value, obj->GetMember(L"value"), tokens)) { UnescapeString(tree->value, tokens); } } void Fill(vl::Ptr tree, vl::Ptr obj, const TokenList& tokens) { SetMember(tree->op, obj->GetMember(L"op"), tokens); SetMember(tree->operand, obj->GetMember(L"operand"), tokens); } void Fill(vl::Ptr tree, vl::Ptr 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 tree, vl::Ptr obj, const TokenList& tokens) { SetMember(tree->name, obj->GetMember(L"name"), tokens); SetMember(tree->value, obj->GetMember(L"value"), tokens); } void Fill(vl::Ptr tree, vl::Ptr obj, const TokenList& tokens) { SetMember(tree->variables, obj->GetMember(L"variables"), tokens); SetMember(tree->expression, obj->GetMember(L"expression"), tokens); } void Fill(vl::Ptr tree, vl::Ptr 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 tree, vl::Ptr 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 tree, vl::Ptr 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 tree, vl::Ptr obj, const TokenList& tokens) { SetMember(tree->key, obj->GetMember(L"key"), tokens); SetMember(tree->value, obj->GetMember(L"value"), tokens); } void Fill(vl::Ptr tree, vl::Ptr obj, const TokenList& tokens) { SetMember(tree->arguments, obj->GetMember(L"arguments"), tokens); } void Fill(vl::Ptr tree, vl::Ptr obj, const TokenList& tokens) { SetMember(tree->expression, obj->GetMember(L"expression"), tokens); SetMember(tree->type, obj->GetMember(L"type"), tokens); } void Fill(vl::Ptr tree, vl::Ptr 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 tree, vl::Ptr 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 tree, vl::Ptr obj, const TokenList& tokens) { SetMember(tree->type, obj->GetMember(L"type"), tokens); } void Fill(vl::Ptr tree, vl::Ptr obj, const TokenList& tokens) { SetMember(tree->expression, obj->GetMember(L"expression"), tokens); } void Fill(vl::Ptr tree, vl::Ptr obj, const TokenList& tokens) { SetMember(tree->event, obj->GetMember(L"event"), tokens); SetMember(tree->function, obj->GetMember(L"function"), tokens); } void Fill(vl::Ptr tree, vl::Ptr obj, const TokenList& tokens) { SetMember(tree->event, obj->GetMember(L"event"), tokens); SetMember(tree->handler, obj->GetMember(L"handler"), tokens); } void Fill(vl::Ptr tree, vl::Ptr 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 tree, vl::Ptr obj, const TokenList& tokens) { SetMember(tree->function, obj->GetMember(L"function"), tokens); SetMember(tree->arguments, obj->GetMember(L"arguments"), tokens); } void Fill(vl::Ptr tree, vl::Ptr obj, const TokenList& tokens) { SetMember(tree->function, obj->GetMember(L"function"), tokens); } void Fill(vl::Ptr tree, vl::Ptr obj, const TokenList& tokens) { SetMember(tree->type, obj->GetMember(L"type"), tokens); SetMember(tree->arguments, obj->GetMember(L"arguments"), tokens); } void Fill(vl::Ptr tree, vl::Ptr 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 tree, vl::Ptr obj, const TokenList& tokens) { SetMember(tree->expandedExpression, obj->GetMember(L"expandedExpression"), tokens); } void Fill(vl::Ptr tree, vl::Ptr obj, const TokenList& tokens) { if(SetMember(tree->value, obj->GetMember(L"value"), tokens)) { UnescapeFormatString(tree->value, tokens); } } void Fill(vl::Ptr tree, vl::Ptr obj, const TokenList& tokens) { SetMember(tree->expandedExpression, obj->GetMember(L"expandedExpression"), tokens); } void Fill(vl::Ptr tree, vl::Ptr obj, const TokenList& tokens) { SetMember(tree->expression, obj->GetMember(L"expression"), tokens); } void Fill(vl::Ptr tree, vl::Ptr obj, const TokenList& tokens) { SetMember(tree->name, obj->GetMember(L"name"), tokens); SetMember(tree->statement, obj->GetMember(L"statement"), tokens); } void Fill(vl::Ptr tree, vl::Ptr obj, const TokenList& tokens) { SetMember(tree->type, obj->GetMember(L"type"), tokens); SetMember(tree->expression, obj->GetMember(L"expression"), tokens); } void Fill(vl::Ptr tree, vl::Ptr obj, const TokenList& tokens) { SetMember(tree->strategy, obj->GetMember(L"strategy"), tokens); SetMember(tree->expression, obj->GetMember(L"expression"), tokens); } void Fill(vl::Ptr tree, vl::Ptr obj, const TokenList& tokens) { SetMember(tree->name, obj->GetMember(L"name"), tokens); } void Fill(vl::Ptr tree, vl::Ptr obj, const TokenList& tokens) { } void Fill(vl::Ptr tree, vl::Ptr obj, const TokenList& tokens) { SetMember(tree->name, obj->GetMember(L"name"), tokens); } void Fill(vl::Ptr tree, vl::Ptr obj, const TokenList& tokens) { } void Fill(vl::Ptr tree, vl::Ptr obj, const TokenList& tokens) { SetMember(tree->fragments, obj->GetMember(L"fragments"), tokens); } void Fill(vl::Ptr tree, vl::Ptr obj, const TokenList& tokens) { SetMember(tree->items, obj->GetMember(L"items"), tokens); } void Fill(vl::Ptr tree, vl::Ptr 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 ConvertClass(vl::Ptr obj, const TokenList& tokens)override { if(obj->GetType()==L"ClassMember") { vl::Ptr tree = new WfClassMember; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); return tree; } else if(obj->GetType()==L"Attribute") { vl::Ptr tree = new WfAttribute; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); return tree; } else if(obj->GetType()==L"PredefinedType") { vl::Ptr tree = new WfPredefinedType; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"TopQualifiedType") { vl::Ptr tree = new WfTopQualifiedType; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"ReferenceType") { vl::Ptr tree = new WfReferenceType; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"RawPointerType") { vl::Ptr tree = new WfRawPointerType; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"SharedPointerType") { vl::Ptr tree = new WfSharedPointerType; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"NullableType") { vl::Ptr tree = new WfNullableType; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"EnumerableType") { vl::Ptr tree = new WfEnumerableType; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"MapType") { vl::Ptr tree = new WfMapType; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"ObservableListType") { vl::Ptr tree = new WfObservableListType; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"FunctionType") { vl::Ptr tree = new WfFunctionType; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"ChildType") { vl::Ptr tree = new WfChildType; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"NamespaceDeclaration") { vl::Ptr tree = new WfNamespaceDeclaration; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"FunctionArgument") { vl::Ptr tree = new WfFunctionArgument; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); return tree; } else if(obj->GetType()==L"FunctionDeclaration") { vl::Ptr tree = new WfFunctionDeclaration; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"VariableDeclaration") { vl::Ptr tree = new WfVariableDeclaration; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"EventDeclaration") { vl::Ptr tree = new WfEventDeclaration; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"PropertyDeclaration") { vl::Ptr tree = new WfPropertyDeclaration; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"BaseConstructorCall") { vl::Ptr tree = new WfBaseConstructorCall; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); return tree; } else if(obj->GetType()==L"ConstructorDeclaration") { vl::Ptr tree = new WfConstructorDeclaration; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"DestructorDeclaration") { vl::Ptr tree = new WfDestructorDeclaration; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"ClassDeclaration") { vl::Ptr tree = new WfClassDeclaration; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"EnumItemIntersection") { vl::Ptr tree = new WfEnumItemIntersection; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); return tree; } else if(obj->GetType()==L"EnumItem") { vl::Ptr tree = new WfEnumItem; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); return tree; } else if(obj->GetType()==L"EnumDeclaration") { vl::Ptr tree = new WfEnumDeclaration; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"StructMember") { vl::Ptr tree = new WfStructMember; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); return tree; } else if(obj->GetType()==L"StructDeclaration") { vl::Ptr tree = new WfStructDeclaration; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"AutoPropertyDeclaration") { vl::Ptr tree = new WfAutoPropertyDeclaration; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"CastResultInterfaceDeclaration") { vl::Ptr tree = new WfCastResultInterfaceDeclaration; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"StateInput") { vl::Ptr tree = new WfStateInput; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); return tree; } else if(obj->GetType()==L"StateDeclaration") { vl::Ptr tree = new WfStateDeclaration; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); return tree; } else if(obj->GetType()==L"StateMachineDeclaration") { vl::Ptr tree = new WfStateMachineDeclaration; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"BreakStatement") { vl::Ptr tree = new WfBreakStatement; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"ContinueStatement") { vl::Ptr tree = new WfContinueStatement; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"ReturnStatement") { vl::Ptr tree = new WfReturnStatement; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"DeleteStatement") { vl::Ptr tree = new WfDeleteStatement; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"RaiseExceptionStatement") { vl::Ptr tree = new WfRaiseExceptionStatement; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"IfStatement") { vl::Ptr tree = new WfIfStatement; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"WhileStatement") { vl::Ptr tree = new WfWhileStatement; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"TryStatement") { vl::Ptr tree = new WfTryStatement; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"BlockStatement") { vl::Ptr tree = new WfBlockStatement; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"GotoStatement") { vl::Ptr tree = new WfGotoStatement; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"VariableStatement") { vl::Ptr tree = new WfVariableStatement; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"ExpressionStatement") { vl::Ptr tree = new WfExpressionStatement; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"ForEachStatement") { vl::Ptr tree = new WfForEachStatement; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"SwitchCase") { vl::Ptr tree = new WfSwitchCase; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); return tree; } else if(obj->GetType()==L"SwitchStatement") { vl::Ptr tree = new WfSwitchStatement; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"CoProviderStatement") { vl::Ptr tree = new WfCoProviderStatement; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"CoPauseStatement") { vl::Ptr tree = new WfCoPauseStatement; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"CoOperatorStatement") { vl::Ptr tree = new WfCoOperatorStatement; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"StateSwitchArgument") { vl::Ptr tree = new WfStateSwitchArgument; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); return tree; } else if(obj->GetType()==L"StateSwitchCase") { vl::Ptr tree = new WfStateSwitchCase; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); return tree; } else if(obj->GetType()==L"StateSwitchStatement") { vl::Ptr tree = new WfStateSwitchStatement; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"StateInvokeStatement") { vl::Ptr tree = new WfStateInvokeStatement; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"ThisExpression") { vl::Ptr tree = new WfThisExpression; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"TopQualifiedExpression") { vl::Ptr tree = new WfTopQualifiedExpression; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"ReferenceExpression") { vl::Ptr tree = new WfReferenceExpression; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"OrderedNameExpression") { vl::Ptr tree = new WfOrderedNameExpression; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"OrderedLambdaExpression") { vl::Ptr tree = new WfOrderedLambdaExpression; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"MemberExpression") { vl::Ptr tree = new WfMemberExpression; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"ChildExpression") { vl::Ptr tree = new WfChildExpression; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"LiteralExpression") { vl::Ptr tree = new WfLiteralExpression; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"FloatingExpression") { vl::Ptr tree = new WfFloatingExpression; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"IntegerExpression") { vl::Ptr tree = new WfIntegerExpression; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"StringExpression") { vl::Ptr tree = new WfStringExpression; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"UnaryExpression") { vl::Ptr tree = new WfUnaryExpression; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"BinaryExpression") { vl::Ptr tree = new WfBinaryExpression; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"LetVariable") { vl::Ptr tree = new WfLetVariable; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); return tree; } else if(obj->GetType()==L"LetExpression") { vl::Ptr tree = new WfLetExpression; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"IfExpression") { vl::Ptr tree = new WfIfExpression; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"RangeExpression") { vl::Ptr tree = new WfRangeExpression; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"SetTestingExpression") { vl::Ptr tree = new WfSetTestingExpression; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"ConstructorArgument") { vl::Ptr tree = new WfConstructorArgument; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); return tree; } else if(obj->GetType()==L"ConstructorExpression") { vl::Ptr tree = new WfConstructorExpression; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"InferExpression") { vl::Ptr tree = new WfInferExpression; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"TypeCastingExpression") { vl::Ptr tree = new WfTypeCastingExpression; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"TypeTestingExpression") { vl::Ptr tree = new WfTypeTestingExpression; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"TypeOfTypeExpression") { vl::Ptr tree = new WfTypeOfTypeExpression; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"TypeOfExpressionExpression") { vl::Ptr tree = new WfTypeOfExpressionExpression; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"AttachEventExpression") { vl::Ptr tree = new WfAttachEventExpression; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"DetachEventExpression") { vl::Ptr tree = new WfDetachEventExpression; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"ObserveExpression") { vl::Ptr tree = new WfObserveExpression; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"CallExpression") { vl::Ptr tree = new WfCallExpression; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"FunctionExpression") { vl::Ptr tree = new WfFunctionExpression; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"NewClassExpression") { vl::Ptr tree = new WfNewClassExpression; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"NewInterfaceExpression") { vl::Ptr tree = new WfNewInterfaceExpression; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"FormatExpression") { vl::Ptr tree = new WfFormatExpression; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"BindExpression") { vl::Ptr tree = new WfBindExpression; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"NewCoroutineExpression") { vl::Ptr tree = new WfNewCoroutineExpression; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"MixinCastExpression") { vl::Ptr tree = new WfMixinCastExpression; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"ExpectedTypeCastExpression") { vl::Ptr tree = new WfExpectedTypeCastExpression; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"CoOperatorExpression") { vl::Ptr tree = new WfCoOperatorExpression; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"ModuleUsingNameFragment") { vl::Ptr tree = new WfModuleUsingNameFragment; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"ModuleUsingWildCardFragment") { vl::Ptr tree = new WfModuleUsingWildCardFragment; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); Fill(tree.Cast(), obj, tokens); return tree; } else if(obj->GetType()==L"ModuleUsingItem") { vl::Ptr tree = new WfModuleUsingItem; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); return tree; } else if(obj->GetType()==L"ModuleUsingPath") { vl::Ptr tree = new WfModuleUsingPath; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); return tree; } else if(obj->GetType()==L"Module") { vl::Ptr tree = new WfModule; vl::collections::CopyFrom(tree->creatorRules, obj->GetCreatorRules()); Fill(tree, obj, tokens); return tree; } else return 0; } }; vl::Ptr WfConvertParsingTreeNode(vl::Ptr node, const vl::collections::List& tokens) { WfTreeConverter converter; vl::Ptr tree; converter.SetMember(tree, node, tokens); return tree; } /*********************************************************************** Parsing Tree Conversion Implementation ***********************************************************************/ vl::Ptr WfClassMember::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfAttribute::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfPredefinedType::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfTopQualifiedType::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfReferenceType::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfRawPointerType::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfSharedPointerType::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfNullableType::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfEnumerableType::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfMapType::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfObservableListType::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfFunctionType::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfChildType::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfNamespaceDeclaration::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfFunctionArgument::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfFunctionDeclaration::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfVariableDeclaration::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfEventDeclaration::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfPropertyDeclaration::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfBaseConstructorCall::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfConstructorDeclaration::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfDestructorDeclaration::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfClassDeclaration::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfEnumItemIntersection::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfEnumItem::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfEnumDeclaration::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfStructMember::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfStructDeclaration::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfAutoPropertyDeclaration::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfCastResultInterfaceDeclaration::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfStateInput::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfStateDeclaration::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfStateMachineDeclaration::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfBreakStatement::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfContinueStatement::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfReturnStatement::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfDeleteStatement::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfRaiseExceptionStatement::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfIfStatement::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfWhileStatement::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfTryStatement::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfBlockStatement::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfGotoStatement::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfVariableStatement::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfExpressionStatement::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfForEachStatement::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfSwitchCase::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfSwitchStatement::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfCoProviderStatement::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfCoPauseStatement::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfCoOperatorStatement::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfStateSwitchArgument::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfStateSwitchCase::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfStateSwitchStatement::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfStateInvokeStatement::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfThisExpression::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfTopQualifiedExpression::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfReferenceExpression::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfOrderedNameExpression::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfOrderedLambdaExpression::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfMemberExpression::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfChildExpression::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfLiteralExpression::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfFloatingExpression::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfIntegerExpression::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfStringExpression::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfUnaryExpression::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfBinaryExpression::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfLetVariable::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfLetExpression::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfIfExpression::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfRangeExpression::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfSetTestingExpression::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfConstructorArgument::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfConstructorExpression::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfInferExpression::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfTypeCastingExpression::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfTypeTestingExpression::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfTypeOfTypeExpression::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfTypeOfExpressionExpression::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfAttachEventExpression::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfDetachEventExpression::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfObserveExpression::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfCallExpression::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfFunctionExpression::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfNewClassExpression::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfNewInterfaceExpression::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfFormatExpression::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfBindExpression::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfNewCoroutineExpression::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfMixinCastExpression::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfExpectedTypeCastExpression::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfCoOperatorExpression::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfModuleUsingNameFragment::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfModuleUsingWildCardFragment::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfModuleUsingItem::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfModuleUsingPath::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } vl::Ptr WfModule::Convert(vl::Ptr node, const vl::collections::List& tokens) { return WfConvertParsingTreeNode(node, tokens).Cast(); } /*********************************************************************** Parser Function ***********************************************************************/ vl::Ptr WfParseCoProviderStatementAsParsingTreeNode(const vl::WString& input, vl::Ptr table, vl::collections::List>& errors, vl::vint codeIndex) { vl::parsing::tabling::ParsingState state(input, table, codeIndex); state.Reset(L"_CoProvider"); vl::Ptr parser=vl::parsing::tabling::CreateStrictParser(table); vl::Ptr node=parser->Parse(state, errors); return node; } vl::Ptr WfParseCoProviderStatementAsParsingTreeNode(const vl::WString& input, vl::Ptr table, vl::vint codeIndex) { vl::collections::List> errors; return WfParseCoProviderStatementAsParsingTreeNode(input, table, errors, codeIndex); } vl::Ptr WfParseCoProviderStatement(const vl::WString& input, vl::Ptr table, vl::collections::List>& errors, vl::vint codeIndex) { vl::parsing::tabling::ParsingState state(input, table, codeIndex); state.Reset(L"_CoProvider"); vl::Ptr parser=vl::parsing::tabling::CreateStrictParser(table); vl::Ptr node=parser->Parse(state, errors); if(node && errors.Count()==0) { return WfConvertParsingTreeNode(node, state.GetTokens()).Cast(); } return 0; } vl::Ptr WfParseCoProviderStatement(const vl::WString& input, vl::Ptr table, vl::vint codeIndex) { vl::collections::List> errors; return WfParseCoProviderStatement(input, table, errors, codeIndex); } vl::Ptr WfParseDeclarationAsParsingTreeNode(const vl::WString& input, vl::Ptr table, vl::collections::List>& errors, vl::vint codeIndex) { vl::parsing::tabling::ParsingState state(input, table, codeIndex); state.Reset(L"_Declaration"); vl::Ptr parser=vl::parsing::tabling::CreateStrictParser(table); vl::Ptr node=parser->Parse(state, errors); return node; } vl::Ptr WfParseDeclarationAsParsingTreeNode(const vl::WString& input, vl::Ptr table, vl::vint codeIndex) { vl::collections::List> errors; return WfParseDeclarationAsParsingTreeNode(input, table, errors, codeIndex); } vl::Ptr WfParseDeclaration(const vl::WString& input, vl::Ptr table, vl::collections::List>& errors, vl::vint codeIndex) { vl::parsing::tabling::ParsingState state(input, table, codeIndex); state.Reset(L"_Declaration"); vl::Ptr parser=vl::parsing::tabling::CreateStrictParser(table); vl::Ptr node=parser->Parse(state, errors); if(node && errors.Count()==0) { return WfConvertParsingTreeNode(node, state.GetTokens()).Cast(); } return 0; } vl::Ptr WfParseDeclaration(const vl::WString& input, vl::Ptr table, vl::vint codeIndex) { vl::collections::List> errors; return WfParseDeclaration(input, table, errors, codeIndex); } vl::Ptr WfParseExpressionAsParsingTreeNode(const vl::WString& input, vl::Ptr table, vl::collections::List>& errors, vl::vint codeIndex) { vl::parsing::tabling::ParsingState state(input, table, codeIndex); state.Reset(L"_Expression"); vl::Ptr parser=vl::parsing::tabling::CreateStrictParser(table); vl::Ptr node=parser->Parse(state, errors); return node; } vl::Ptr WfParseExpressionAsParsingTreeNode(const vl::WString& input, vl::Ptr table, vl::vint codeIndex) { vl::collections::List> errors; return WfParseExpressionAsParsingTreeNode(input, table, errors, codeIndex); } vl::Ptr WfParseExpression(const vl::WString& input, vl::Ptr table, vl::collections::List>& errors, vl::vint codeIndex) { vl::parsing::tabling::ParsingState state(input, table, codeIndex); state.Reset(L"_Expression"); vl::Ptr parser=vl::parsing::tabling::CreateStrictParser(table); vl::Ptr node=parser->Parse(state, errors); if(node && errors.Count()==0) { return WfConvertParsingTreeNode(node, state.GetTokens()).Cast(); } return 0; } vl::Ptr WfParseExpression(const vl::WString& input, vl::Ptr table, vl::vint codeIndex) { vl::collections::List> errors; return WfParseExpression(input, table, errors, codeIndex); } vl::Ptr WfParseModuleAsParsingTreeNode(const vl::WString& input, vl::Ptr table, vl::collections::List>& errors, vl::vint codeIndex) { vl::parsing::tabling::ParsingState state(input, table, codeIndex); state.Reset(L"_Module"); vl::Ptr parser=vl::parsing::tabling::CreateStrictParser(table); vl::Ptr node=parser->Parse(state, errors); return node; } vl::Ptr WfParseModuleAsParsingTreeNode(const vl::WString& input, vl::Ptr table, vl::vint codeIndex) { vl::collections::List> errors; return WfParseModuleAsParsingTreeNode(input, table, errors, codeIndex); } vl::Ptr WfParseModule(const vl::WString& input, vl::Ptr table, vl::collections::List>& errors, vl::vint codeIndex) { vl::parsing::tabling::ParsingState state(input, table, codeIndex); state.Reset(L"_Module"); vl::Ptr parser=vl::parsing::tabling::CreateStrictParser(table); vl::Ptr node=parser->Parse(state, errors); if(node && errors.Count()==0) { return WfConvertParsingTreeNode(node, state.GetTokens()).Cast(); } return 0; } vl::Ptr WfParseModule(const vl::WString& input, vl::Ptr table, vl::vint codeIndex) { vl::collections::List> errors; return WfParseModule(input, table, errors, codeIndex); } vl::Ptr WfParseStatementAsParsingTreeNode(const vl::WString& input, vl::Ptr table, vl::collections::List>& errors, vl::vint codeIndex) { vl::parsing::tabling::ParsingState state(input, table, codeIndex); state.Reset(L"_Statement"); vl::Ptr parser=vl::parsing::tabling::CreateStrictParser(table); vl::Ptr node=parser->Parse(state, errors); return node; } vl::Ptr WfParseStatementAsParsingTreeNode(const vl::WString& input, vl::Ptr table, vl::vint codeIndex) { vl::collections::List> errors; return WfParseStatementAsParsingTreeNode(input, table, errors, codeIndex); } vl::Ptr WfParseStatement(const vl::WString& input, vl::Ptr table, vl::collections::List>& errors, vl::vint codeIndex) { vl::parsing::tabling::ParsingState state(input, table, codeIndex); state.Reset(L"_Statement"); vl::Ptr parser=vl::parsing::tabling::CreateStrictParser(table); vl::Ptr node=parser->Parse(state, errors); if(node && errors.Count()==0) { return WfConvertParsingTreeNode(node, state.GetTokens()).Cast(); } return 0; } vl::Ptr WfParseStatement(const vl::WString& input, vl::Ptr table, vl::vint codeIndex) { vl::collections::List> errors; return WfParseStatement(input, table, errors, codeIndex); } vl::Ptr WfParseTypeAsParsingTreeNode(const vl::WString& input, vl::Ptr table, vl::collections::List>& errors, vl::vint codeIndex) { vl::parsing::tabling::ParsingState state(input, table, codeIndex); state.Reset(L"_Type"); vl::Ptr parser=vl::parsing::tabling::CreateStrictParser(table); vl::Ptr node=parser->Parse(state, errors); return node; } vl::Ptr WfParseTypeAsParsingTreeNode(const vl::WString& input, vl::Ptr table, vl::vint codeIndex) { vl::collections::List> errors; return WfParseTypeAsParsingTreeNode(input, table, errors, codeIndex); } vl::Ptr WfParseType(const vl::WString& input, vl::Ptr table, vl::collections::List>& errors, vl::vint codeIndex) { vl::parsing::tabling::ParsingState state(input, table, codeIndex); state.Reset(L"_Type"); vl::Ptr parser=vl::parsing::tabling::CreateStrictParser(table); vl::Ptr node=parser->Parse(state, errors); if(node && errors.Count()==0) { return WfConvertParsingTreeNode(node, state.GetTokens()).Cast(); } return 0; } vl::Ptr WfParseType(const vl::WString& input, vl::Ptr table, vl::vint codeIndex) { vl::collections::List> errors; return WfParseType(input, table, errors, codeIndex); } /*********************************************************************** Table Generation ***********************************************************************/ vl::Ptr WfLoadTable() { vl::stream::MemoryStream stream; WfGetParserBuffer(stream); vl::Ptr table=new vl::parsing::tabling::ParsingTable(stream); table->Initialize(); return table; } } } /*********************************************************************** .\EXPRESSION\WFEXPRESSION_TRAVERSE.CPP ***********************************************************************/ /*********************************************************************** This file is generated by: Vczh Parser Generator From parser definition:WfExpression.parser.txt Licensed under https://github.com/vczh-libraries/License ***********************************************************************/ 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(WfObservableListType* node) { } void TypeVisitor::Traverse(WfFunctionType* node) { } void TypeVisitor::Traverse(WfChildType* node) { } // Visitor Members ----------------------------------- void TypeVisitor::Visit(WfPredefinedType* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); } void TypeVisitor::Visit(WfTopQualifiedType* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(node->name); } void TypeVisitor::Visit(WfReferenceType* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(node->name); } void TypeVisitor::Visit(WfRawPointerType* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); VisitField(node->element.Obj()); } void TypeVisitor::Visit(WfSharedPointerType* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); VisitField(node->element.Obj()); } void TypeVisitor::Visit(WfNullableType* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); VisitField(node->element.Obj()); } void TypeVisitor::Visit(WfEnumerableType* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); VisitField(node->element.Obj()); } void TypeVisitor::Visit(WfMapType* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); VisitField(node->key.Obj()); VisitField(node->value.Obj()); } void TypeVisitor::Visit(WfObservableListType* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); VisitField(node->element.Obj()); } void TypeVisitor::Visit(WfFunctionType* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); VisitField(node->result.Obj()); FOREACH(vl::Ptr, listItem, node->arguments) { VisitField(listItem.Obj()); } } void TypeVisitor::Visit(WfChildType* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(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(node)); Traverse(static_cast(node)); Traverse(node->name); VisitField(node->value.Obj()); } void ExpressionVisitor::VisitField(WfConstructorArgument* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); VisitField(node->key.Obj()); VisitField(node->value.Obj()); } void ExpressionVisitor::VisitField(WfFunctionDeclaration* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); FOREACH(vl::Ptr, listItem, node->arguments) { VisitField(listItem.Obj()); } VisitField(node->returnType.Obj()); VisitField(node->statement.Obj()); FOREACH(vl::Ptr, listItem, node->attributes) { VisitField(listItem.Obj()); } Traverse(node->name); VisitField(node->classMember.Obj()); } void ExpressionVisitor::VisitField(WfAttribute* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(node->category); Traverse(node->name); VisitField(node->value.Obj()); } void ExpressionVisitor::VisitField(WfClassMember* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); } void ExpressionVisitor::VisitField(WfFunctionArgument* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); FOREACH(vl::Ptr, listItem, node->attributes) { VisitField(listItem.Obj()); } Traverse(node->name); VisitField(node->type.Obj()); } // Visitor Members ----------------------------------- void ExpressionVisitor::Visit(WfThisExpression* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); } void ExpressionVisitor::Visit(WfTopQualifiedExpression* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(node->name); } void ExpressionVisitor::Visit(WfReferenceExpression* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(node->name); } void ExpressionVisitor::Visit(WfOrderedNameExpression* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(node->name); } void ExpressionVisitor::Visit(WfOrderedLambdaExpression* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); VisitField(node->body.Obj()); } void ExpressionVisitor::Visit(WfMemberExpression* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); VisitField(node->parent.Obj()); Traverse(node->name); } void ExpressionVisitor::Visit(WfChildExpression* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); VisitField(node->parent.Obj()); Traverse(node->name); } void ExpressionVisitor::Visit(WfLiteralExpression* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); } void ExpressionVisitor::Visit(WfFloatingExpression* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(node->value); } void ExpressionVisitor::Visit(WfIntegerExpression* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(node->value); } void ExpressionVisitor::Visit(WfStringExpression* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(node->value); } void ExpressionVisitor::Visit(WfUnaryExpression* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); VisitField(node->operand.Obj()); } void ExpressionVisitor::Visit(WfBinaryExpression* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); VisitField(node->first.Obj()); VisitField(node->second.Obj()); } void ExpressionVisitor::Visit(WfLetExpression* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); FOREACH(vl::Ptr, listItem, node->variables) { VisitField(listItem.Obj()); } VisitField(node->expression.Obj()); } void ExpressionVisitor::Visit(WfIfExpression* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); VisitField(node->condition.Obj()); VisitField(node->trueBranch.Obj()); VisitField(node->falseBranch.Obj()); } void ExpressionVisitor::Visit(WfRangeExpression* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); VisitField(node->begin.Obj()); VisitField(node->end.Obj()); } void ExpressionVisitor::Visit(WfSetTestingExpression* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); VisitField(node->element.Obj()); VisitField(node->collection.Obj()); } void ExpressionVisitor::Visit(WfConstructorExpression* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); FOREACH(vl::Ptr, listItem, node->arguments) { VisitField(listItem.Obj()); } } void ExpressionVisitor::Visit(WfInferExpression* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); VisitField(node->expression.Obj()); VisitField(node->type.Obj()); } void ExpressionVisitor::Visit(WfTypeCastingExpression* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); VisitField(node->expression.Obj()); VisitField(node->type.Obj()); } void ExpressionVisitor::Visit(WfTypeTestingExpression* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); VisitField(node->expression.Obj()); VisitField(node->type.Obj()); } void ExpressionVisitor::Visit(WfTypeOfTypeExpression* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); VisitField(node->type.Obj()); } void ExpressionVisitor::Visit(WfTypeOfExpressionExpression* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); VisitField(node->expression.Obj()); } void ExpressionVisitor::Visit(WfAttachEventExpression* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); VisitField(node->event.Obj()); VisitField(node->function.Obj()); } void ExpressionVisitor::Visit(WfDetachEventExpression* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); VisitField(node->event.Obj()); VisitField(node->handler.Obj()); } void ExpressionVisitor::Visit(WfObserveExpression* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); VisitField(node->parent.Obj()); Traverse(node->name); VisitField(node->expression.Obj()); FOREACH(vl::Ptr, listItem, node->events) { VisitField(listItem.Obj()); } } void ExpressionVisitor::Visit(WfCallExpression* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); VisitField(node->function.Obj()); FOREACH(vl::Ptr, listItem, node->arguments) { VisitField(listItem.Obj()); } } void ExpressionVisitor::Visit(WfFunctionExpression* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); VisitField(node->function.Obj()); } void ExpressionVisitor::Visit(WfNewClassExpression* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); VisitField(node->type.Obj()); FOREACH(vl::Ptr, listItem, node->arguments) { VisitField(listItem.Obj()); } } void ExpressionVisitor::Visit(WfNewInterfaceExpression* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); VisitField(node->type.Obj()); FOREACH(vl::Ptr, listItem, node->declarations) { VisitField(listItem.Obj()); } } void ExpressionVisitor::Visit(WfVirtualCfeExpression* node) { Dispatch(node); } void ExpressionVisitor::Visit(WfVirtualCseExpression* 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(WfGotoStatement* 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(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); VisitField(node->type.Obj()); VisitField(node->expression.Obj()); FOREACH(vl::Ptr, listItem, node->attributes) { VisitField(listItem.Obj()); } Traverse(node->name); VisitField(node->classMember.Obj()); } void StatementVisitor::VisitField(WfAttribute* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(node->category); Traverse(node->name); VisitField(node->value.Obj()); } void StatementVisitor::VisitField(WfClassMember* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); } // Visitor Members ----------------------------------- void StatementVisitor::Visit(WfBreakStatement* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); } void StatementVisitor::Visit(WfContinueStatement* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); } void StatementVisitor::Visit(WfReturnStatement* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); VisitField(node->expression.Obj()); } void StatementVisitor::Visit(WfDeleteStatement* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); VisitField(node->expression.Obj()); } void StatementVisitor::Visit(WfRaiseExceptionStatement* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); VisitField(node->expression.Obj()); } void StatementVisitor::Visit(WfIfStatement* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(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(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); VisitField(node->condition.Obj()); VisitField(node->statement.Obj()); } void StatementVisitor::Visit(WfTryStatement* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); VisitField(node->protectedStatement.Obj()); Traverse(node->name); VisitField(node->catchStatement.Obj()); VisitField(node->finallyStatement.Obj()); } void StatementVisitor::Visit(WfBlockStatement* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); FOREACH(vl::Ptr, listItem, node->statements) { VisitField(listItem.Obj()); } Traverse(node->endLabel); } void StatementVisitor::Visit(WfGotoStatement* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(node->label); } void StatementVisitor::Visit(WfVariableStatement* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); VisitField(node->variable.Obj()); } void StatementVisitor::Visit(WfExpressionStatement* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); VisitField(node->expression.Obj()); } void StatementVisitor::Visit(WfVirtualCseStatement* node) { Dispatch(node); } void StatementVisitor::Visit(WfCoroutineStatement* node) { Dispatch(node); } void StatementVisitor::Visit(WfStateMachineStatement* 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(node)); Traverse(static_cast(node)); Traverse(node->category); Traverse(node->name); VisitField(node->value.Obj()); } void DeclarationVisitor::VisitField(WfClassMember* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); } void DeclarationVisitor::VisitField(WfFunctionArgument* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); FOREACH(vl::Ptr, listItem, node->attributes) { VisitField(listItem.Obj()); } Traverse(node->name); VisitField(node->type.Obj()); } void DeclarationVisitor::VisitField(WfBaseConstructorCall* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); VisitField(node->type.Obj()); FOREACH(vl::Ptr, listItem, node->arguments) { VisitField(listItem.Obj()); } } void DeclarationVisitor::VisitField(WfEnumItem* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); FOREACH(vl::Ptr, listItem, node->attributes) { VisitField(listItem.Obj()); } Traverse(node->name); Traverse(node->number); FOREACH(vl::Ptr, listItem, node->intersections) { VisitField(listItem.Obj()); } } void DeclarationVisitor::VisitField(WfEnumItemIntersection* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(node->name); } void DeclarationVisitor::VisitField(WfStructMember* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); FOREACH(vl::Ptr, listItem, node->attributes) { VisitField(listItem.Obj()); } Traverse(node->name); VisitField(node->type.Obj()); } // Visitor Members ----------------------------------- void DeclarationVisitor::Visit(WfNamespaceDeclaration* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); FOREACH(vl::Ptr, listItem, node->declarations) { VisitField(listItem.Obj()); } FOREACH(vl::Ptr, listItem, node->attributes) { VisitField(listItem.Obj()); } Traverse(node->name); VisitField(node->classMember.Obj()); } void DeclarationVisitor::Visit(WfFunctionDeclaration* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); FOREACH(vl::Ptr, listItem, node->arguments) { VisitField(listItem.Obj()); } VisitField(node->returnType.Obj()); VisitField(node->statement.Obj()); FOREACH(vl::Ptr, listItem, node->attributes) { VisitField(listItem.Obj()); } Traverse(node->name); VisitField(node->classMember.Obj()); } void DeclarationVisitor::Visit(WfVariableDeclaration* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); VisitField(node->type.Obj()); VisitField(node->expression.Obj()); FOREACH(vl::Ptr, listItem, node->attributes) { VisitField(listItem.Obj()); } Traverse(node->name); VisitField(node->classMember.Obj()); } void DeclarationVisitor::Visit(WfEventDeclaration* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); FOREACH(vl::Ptr, listItem, node->arguments) { VisitField(listItem.Obj()); } FOREACH(vl::Ptr, listItem, node->attributes) { VisitField(listItem.Obj()); } Traverse(node->name); VisitField(node->classMember.Obj()); } void DeclarationVisitor::Visit(WfPropertyDeclaration* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); VisitField(node->type.Obj()); Traverse(node->getter); Traverse(node->setter); Traverse(node->valueChangedEvent); FOREACH(vl::Ptr, listItem, node->attributes) { VisitField(listItem.Obj()); } Traverse(node->name); VisitField(node->classMember.Obj()); } void DeclarationVisitor::Visit(WfConstructorDeclaration* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); FOREACH(vl::Ptr, listItem, node->baseConstructorCalls) { VisitField(listItem.Obj()); } FOREACH(vl::Ptr, listItem, node->arguments) { VisitField(listItem.Obj()); } VisitField(node->statement.Obj()); FOREACH(vl::Ptr, listItem, node->attributes) { VisitField(listItem.Obj()); } Traverse(node->name); VisitField(node->classMember.Obj()); } void DeclarationVisitor::Visit(WfDestructorDeclaration* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); VisitField(node->statement.Obj()); FOREACH(vl::Ptr, listItem, node->attributes) { VisitField(listItem.Obj()); } Traverse(node->name); VisitField(node->classMember.Obj()); } void DeclarationVisitor::Visit(WfClassDeclaration* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); FOREACH(vl::Ptr, listItem, node->baseTypes) { VisitField(listItem.Obj()); } FOREACH(vl::Ptr, listItem, node->declarations) { VisitField(listItem.Obj()); } FOREACH(vl::Ptr, listItem, node->attributes) { VisitField(listItem.Obj()); } Traverse(node->name); VisitField(node->classMember.Obj()); } void DeclarationVisitor::Visit(WfEnumDeclaration* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); FOREACH(vl::Ptr, listItem, node->items) { VisitField(listItem.Obj()); } FOREACH(vl::Ptr, listItem, node->attributes) { VisitField(listItem.Obj()); } Traverse(node->name); VisitField(node->classMember.Obj()); } void DeclarationVisitor::Visit(WfStructDeclaration* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); FOREACH(vl::Ptr, listItem, node->members) { VisitField(listItem.Obj()); } FOREACH(vl::Ptr, listItem, node->attributes) { VisitField(listItem.Obj()); } Traverse(node->name); VisitField(node->classMember.Obj()); } void DeclarationVisitor::Visit(WfVirtualCfeDeclaration* node) { Dispatch(node); } void DeclarationVisitor::Visit(WfVirtualCseDeclaration* node) { Dispatch(node); } /*********************************************************************** VirtualCfeDeclarationVisitor ***********************************************************************/ // Traverse ------------------------------------------ void VirtualCfeDeclarationVisitor::Traverse(vl::parsing::ParsingToken& token) { } void VirtualCfeDeclarationVisitor::Traverse(vl::parsing::ParsingTreeCustomBase* node) { } void VirtualCfeDeclarationVisitor::Traverse(WfAutoPropertyDeclaration* node) { } void VirtualCfeDeclarationVisitor::Traverse(WfVirtualCfeDeclaration* node) { } void VirtualCfeDeclarationVisitor::Traverse(WfDeclaration* node) { } void VirtualCfeDeclarationVisitor::Traverse(WfAttribute* node) { } void VirtualCfeDeclarationVisitor::Traverse(WfClassMember* node) { } void VirtualCfeDeclarationVisitor::Traverse(WfCastResultInterfaceDeclaration* node) { } // VisitField ---------------------------------------- void VirtualCfeDeclarationVisitor::VisitField(WfAttribute* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(node->category); Traverse(node->name); VisitField(node->value.Obj()); } void VirtualCfeDeclarationVisitor::VisitField(WfClassMember* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); } // Visitor Members ----------------------------------- void VirtualCfeDeclarationVisitor::Visit(WfAutoPropertyDeclaration* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); VisitField(node->type.Obj()); VisitField(node->expression.Obj()); FOREACH(vl::Ptr, listItem, node->expandedDeclarations) { VisitField(listItem.Obj()); } FOREACH(vl::Ptr, listItem, node->attributes) { VisitField(listItem.Obj()); } Traverse(node->name); VisitField(node->classMember.Obj()); } void VirtualCfeDeclarationVisitor::Visit(WfCastResultInterfaceDeclaration* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); VisitField(node->baseType.Obj()); VisitField(node->elementType.Obj()); FOREACH(vl::Ptr, listItem, node->expandedDeclarations) { VisitField(listItem.Obj()); } FOREACH(vl::Ptr, listItem, node->attributes) { VisitField(listItem.Obj()); } Traverse(node->name); VisitField(node->classMember.Obj()); } /*********************************************************************** VirtualCseDeclarationVisitor ***********************************************************************/ // Traverse ------------------------------------------ void VirtualCseDeclarationVisitor::Traverse(vl::parsing::ParsingToken& token) { } void VirtualCseDeclarationVisitor::Traverse(vl::parsing::ParsingTreeCustomBase* node) { } void VirtualCseDeclarationVisitor::Traverse(WfStateMachineDeclaration* node) { } void VirtualCseDeclarationVisitor::Traverse(WfVirtualCseDeclaration* node) { } void VirtualCseDeclarationVisitor::Traverse(WfDeclaration* node) { } void VirtualCseDeclarationVisitor::Traverse(WfAttribute* node) { } void VirtualCseDeclarationVisitor::Traverse(WfClassMember* node) { } void VirtualCseDeclarationVisitor::Traverse(WfStateInput* node) { } void VirtualCseDeclarationVisitor::Traverse(WfFunctionArgument* node) { } void VirtualCseDeclarationVisitor::Traverse(WfStateDeclaration* node) { } // VisitField ---------------------------------------- void VirtualCseDeclarationVisitor::VisitField(WfAttribute* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(node->category); Traverse(node->name); VisitField(node->value.Obj()); } void VirtualCseDeclarationVisitor::VisitField(WfClassMember* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); } void VirtualCseDeclarationVisitor::VisitField(WfStateInput* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(node->name); FOREACH(vl::Ptr, listItem, node->arguments) { VisitField(listItem.Obj()); } } void VirtualCseDeclarationVisitor::VisitField(WfFunctionArgument* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); FOREACH(vl::Ptr, listItem, node->attributes) { VisitField(listItem.Obj()); } Traverse(node->name); VisitField(node->type.Obj()); } void VirtualCseDeclarationVisitor::VisitField(WfStateDeclaration* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(node->name); FOREACH(vl::Ptr, listItem, node->arguments) { VisitField(listItem.Obj()); } VisitField(node->statement.Obj()); } // Visitor Members ----------------------------------- void VirtualCseDeclarationVisitor::Visit(WfStateMachineDeclaration* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); FOREACH(vl::Ptr, listItem, node->inputs) { VisitField(listItem.Obj()); } FOREACH(vl::Ptr, listItem, node->states) { VisitField(listItem.Obj()); } FOREACH(vl::Ptr, listItem, node->expandedDeclarations) { VisitField(listItem.Obj()); } FOREACH(vl::Ptr, listItem, node->attributes) { VisitField(listItem.Obj()); } Traverse(node->name); VisitField(node->classMember.Obj()); } /*********************************************************************** VirtualCseStatementVisitor ***********************************************************************/ // Traverse ------------------------------------------ void VirtualCseStatementVisitor::Traverse(vl::parsing::ParsingToken& token) { } void VirtualCseStatementVisitor::Traverse(vl::parsing::ParsingTreeCustomBase* node) { } void VirtualCseStatementVisitor::Traverse(WfForEachStatement* node) { } void VirtualCseStatementVisitor::Traverse(WfVirtualCseStatement* node) { } void VirtualCseStatementVisitor::Traverse(WfStatement* node) { } void VirtualCseStatementVisitor::Traverse(WfSwitchStatement* node) { } void VirtualCseStatementVisitor::Traverse(WfSwitchCase* node) { } void VirtualCseStatementVisitor::Traverse(WfCoProviderStatement* node) { } // VisitField ---------------------------------------- void VirtualCseStatementVisitor::VisitField(WfSwitchCase* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); VisitField(node->expression.Obj()); VisitField(node->statement.Obj()); } // Visitor Members ----------------------------------- void VirtualCseStatementVisitor::Visit(WfForEachStatement* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(node->name); VisitField(node->collection.Obj()); VisitField(node->statement.Obj()); VisitField(node->expandedStatement.Obj()); } void VirtualCseStatementVisitor::Visit(WfSwitchStatement* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); VisitField(node->expression.Obj()); FOREACH(vl::Ptr, listItem, node->caseBranches) { VisitField(listItem.Obj()); } VisitField(node->defaultBranch.Obj()); VisitField(node->expandedStatement.Obj()); } void VirtualCseStatementVisitor::Visit(WfCoProviderStatement* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(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(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); VisitField(node->statement.Obj()); } void CoroutineStatementVisitor::Visit(WfCoOperatorStatement* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(node->varName); Traverse(node->opName); FOREACH(vl::Ptr, listItem, node->arguments) { VisitField(listItem.Obj()); } } /*********************************************************************** StateMachineStatementVisitor ***********************************************************************/ // Traverse ------------------------------------------ void StateMachineStatementVisitor::Traverse(vl::parsing::ParsingToken& token) { } void StateMachineStatementVisitor::Traverse(vl::parsing::ParsingTreeCustomBase* node) { } void StateMachineStatementVisitor::Traverse(WfStateSwitchStatement* node) { } void StateMachineStatementVisitor::Traverse(WfStateMachineStatement* node) { } void StateMachineStatementVisitor::Traverse(WfStatement* node) { } void StateMachineStatementVisitor::Traverse(WfStateSwitchCase* node) { } void StateMachineStatementVisitor::Traverse(WfStateSwitchArgument* node) { } void StateMachineStatementVisitor::Traverse(WfStateInvokeStatement* node) { } // VisitField ---------------------------------------- void StateMachineStatementVisitor::VisitField(WfStateSwitchCase* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(node->name); FOREACH(vl::Ptr, listItem, node->arguments) { VisitField(listItem.Obj()); } VisitField(node->statement.Obj()); } void StateMachineStatementVisitor::VisitField(WfStateSwitchArgument* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(node->name); } // Visitor Members ----------------------------------- void StateMachineStatementVisitor::Visit(WfStateSwitchStatement* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); FOREACH(vl::Ptr, listItem, node->caseBranches) { VisitField(listItem.Obj()); } } void StateMachineStatementVisitor::Visit(WfStateInvokeStatement* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(node->name); FOREACH(vl::Ptr, listItem, node->arguments) { VisitField(listItem.Obj()); } } /*********************************************************************** VirtualCfeExpressionVisitor ***********************************************************************/ // Traverse ------------------------------------------ void VirtualCfeExpressionVisitor::Traverse(vl::parsing::ParsingToken& token) { } void VirtualCfeExpressionVisitor::Traverse(vl::parsing::ParsingTreeCustomBase* node) { } void VirtualCfeExpressionVisitor::Traverse(WfFormatExpression* node) { } void VirtualCfeExpressionVisitor::Traverse(WfVirtualCfeExpression* node) { } void VirtualCfeExpressionVisitor::Traverse(WfExpression* node) { } // Visitor Members ----------------------------------- void VirtualCfeExpressionVisitor::Visit(WfFormatExpression* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(node->value); VisitField(node->expandedExpression.Obj()); } /*********************************************************************** VirtualCseExpressionVisitor ***********************************************************************/ // Traverse ------------------------------------------ void VirtualCseExpressionVisitor::Traverse(vl::parsing::ParsingToken& token) { } void VirtualCseExpressionVisitor::Traverse(vl::parsing::ParsingTreeCustomBase* node) { } void VirtualCseExpressionVisitor::Traverse(WfBindExpression* node) { } void VirtualCseExpressionVisitor::Traverse(WfVirtualCseExpression* node) { } void VirtualCseExpressionVisitor::Traverse(WfExpression* node) { } void VirtualCseExpressionVisitor::Traverse(WfNewCoroutineExpression* node) { } void VirtualCseExpressionVisitor::Traverse(WfMixinCastExpression* node) { } void VirtualCseExpressionVisitor::Traverse(WfExpectedTypeCastExpression* node) { } void VirtualCseExpressionVisitor::Traverse(WfCoOperatorExpression* node) { } // Visitor Members ----------------------------------- void VirtualCseExpressionVisitor::Visit(WfBindExpression* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); VisitField(node->expression.Obj()); VisitField(node->expandedExpression.Obj()); } void VirtualCseExpressionVisitor::Visit(WfNewCoroutineExpression* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(node->name); VisitField(node->statement.Obj()); VisitField(node->expandedExpression.Obj()); } void VirtualCseExpressionVisitor::Visit(WfMixinCastExpression* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); VisitField(node->type.Obj()); VisitField(node->expression.Obj()); VisitField(node->expandedExpression.Obj()); } void VirtualCseExpressionVisitor::Visit(WfExpectedTypeCastExpression* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); VisitField(node->expression.Obj()); VisitField(node->expandedExpression.Obj()); } void VirtualCseExpressionVisitor::Visit(WfCoOperatorExpression* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(node->name); 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(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(node->name); } void ModuleUsingFragmentVisitor::Visit(WfModuleUsingWildCardFragment* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(static_cast(node)); } /*********************************************************************** ModuleVisitor ***********************************************************************/ void ModuleVisitor::VisitField(WfModule* node) { Traverse(static_cast(node)); Traverse(static_cast(node)); Traverse(node->name); FOREACH(vl::Ptr, listItem, node->paths) { VisitField(listItem.Obj()); } FOREACH(vl::Ptr, 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(node)); Traverse(static_cast(node)); FOREACH(vl::Ptr, listItem, node->items) { VisitField(listItem.Obj()); } } void ModuleVisitor::VisitField(WfModuleUsingItem* node) { if (!node) return; Traverse(static_cast(node)); Traverse(static_cast(node)); FOREACH(vl::Ptr, listItem, node->fragments) { VisitField(listItem.Obj()); } } // VisitField (virtual) ------------------------------ void ModuleVisitor::VisitField(WfType* node) { if (!node) return; node->Accept(static_cast(this)); } void ModuleVisitor::VisitField(WfExpression* node) { if (!node) return; node->Accept(static_cast(this)); } void ModuleVisitor::VisitField(WfStatement* node) { if (!node) return; node->Accept(static_cast(this)); } void ModuleVisitor::VisitField(WfDeclaration* node) { if (!node) return; node->Accept(static_cast(this)); } void ModuleVisitor::VisitField(WfModuleUsingFragment* node) { if (!node) return; node->Accept(static_cast(this)); } // Dispatch (virtual) -------------------------------- void ModuleVisitor::Dispatch(WfVirtualCfeExpression* node) { node->Accept(static_cast(this)); } void ModuleVisitor::Dispatch(WfVirtualCseExpression* node) { node->Accept(static_cast(this)); } void ModuleVisitor::Dispatch(WfVirtualCseStatement* node) { node->Accept(static_cast(this)); } void ModuleVisitor::Dispatch(WfCoroutineStatement* node) { node->Accept(static_cast(this)); } void ModuleVisitor::Dispatch(WfStateMachineStatement* node) { node->Accept(static_cast(this)); } void ModuleVisitor::Dispatch(WfVirtualCfeDeclaration* node) { node->Accept(static_cast(this)); } void ModuleVisitor::Dispatch(WfVirtualCseDeclaration* node) { node->Accept(static_cast(this)); } } } }